From 62bd96e06e7ce84a40fd5df489818897b4036c4d Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Fri, 16 Apr 2021 17:55:40 +0200 Subject: [PATCH 01/81] custom fields stringtemplate, autofocus the last input box --- client/components/cards/cardCustomFields.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/components/cards/cardCustomFields.jade b/client/components/cards/cardCustomFields.jade index 6fa1ac90e..8acf9f5e9 100644 --- a/client/components/cards/cardCustomFields.jade +++ b/client/components/cards/cardCustomFields.jade @@ -125,7 +125,7 @@ template(name="cardCustomField-stringtemplate") +inlinedForm(classNames="js-card-customfield-stringtemplate") each item in stringtemplateItems.get input.js-card-customfield-stringtemplate-item(type="text" value=item placeholder="") - input.js-card-customfield-stringtemplate-item.last(type="text" value="" placeholder="{{_ 'custom-field-stringtemplate-item-placeholder'}}") + input.js-card-customfield-stringtemplate-item.last(type="text" value="" placeholder="{{_ 'custom-field-stringtemplate-item-placeholder'}}" autofocus) .edit-controls.clearfix button.primary(type="submit") {{_ 'save'}} a.fa.fa-times-thin.js-close-inlined-form From c5df78fd8b2b3d37bc9ce878eb8c78bcc59ab957 Mon Sep 17 00:00:00 2001 From: Emile NDAGIJIMANA Date: Thu, 10 Jun 2021 16:38:28 +0200 Subject: [PATCH 02/81] Addressed one of the point cited in issue #802 'Assigning a user to a team or an organization' --- client/components/settings/peopleBody.jade | 52 +++++ client/components/settings/peopleBody.js | 241 ++++++++++++++++++++- client/components/settings/peopleBody.styl | 6 + models/users.js | 77 ++++++- server/publications/people.js | 2 + 5 files changed, 359 insertions(+), 19 deletions(-) diff --git a/client/components/settings/peopleBody.jade b/client/components/settings/peopleBody.jade index 180a6e95b..b20fb9716 100644 --- a/client/components/settings/peopleBody.jade +++ b/client/components/settings/peopleBody.jade @@ -110,6 +110,8 @@ template(name="peopleGeneral") th {{_ 'active'}} th {{_ 'authentication-method'}} th {{_ 'import-usernames'}} + th {{_ 'organizations'}} + th {{_ 'teams'}} th +newUserRow each user in peopleList @@ -257,6 +259,14 @@ template(name="peopleRow") td {{ userData.importUsernamesString }} else td {{ userData.importUsernamesString }} + if userData.loginDisabled + td {{ userData.orgsUserBelongs }} + else + td {{ userData.orgsUserBelongs }} + if userData.loginDisabled + td {{ userData.teamsUserBelongs }} + else + td {{ userData.teamsUserBelongs }} td a.edit-user i.fa.fa-edit @@ -367,6 +377,27 @@ template(name="editUserPopup") option(value="{{value}}" selected) {{_ value}} else option(value="{{value}}") {{_ value}} + label + | {{_ 'organizations'}} + i.fa.fa-plus-square#addUserOrg + i.fa.fa-minus-square#removeUserOrg + select.js-orgs#jsOrgs + option(value="-1") {{_ 'organizations'}} : + each value in orgsDatas + option(value="{{value._id}}") {{_ value.orgDisplayName}} + input#jsUserOrgsInPut.js-userOrgs(type="text" value=user.orgsUserBelongs, disabled) + input#jsUserOrgIdsInPut.js-userOrgIds.hide(type="text" value=user.orgIdsUserBelongs) + label + | {{_ 'teams'}} + i.fa.fa-plus-square#addUserTeam + i.fa.fa-minus-square#removeUserTeam + select.js-teams#jsTeams + option(value="-1") {{_ 'teams'}} : + each value in teamsDatas + option(value="{{value._id}}") {{_ value.teamDisplayName}} + input#jsUserTeamsInPut.js-userteams(type="text" value=user.teamsUserBelongs, disabled) + input#jsUserTeamIdsInPut.js-userteamIds.hide(type="text" value=user.teamIdsUserBelongs) + hr label | {{_ 'password'}} @@ -468,6 +499,27 @@ template(name="newUserPopup") option(value="{{value}}" selected) {{_ value}} else option(value="{{value}}") {{_ value}} + label + | {{_ 'organizations'}} + i.fa.fa-plus-square#addUserOrgNewUser + i.fa.fa-minus-square#removeUserOrgNewUser + select.js-orgsNewUser#jsOrgsNewUser + option(value="-1") {{_ 'organizations'}} : + each value in orgsDatas + option(value="{{value._id}}") {{_ value.orgDisplayName}} + input#jsUserOrgsInPutNewUser.js-userOrgsNewUser(type="text" value=user.orgsUserBelongs, disabled) + input#jsUserOrgIdsInPutNewUser.js-userOrgIdsNewUser.hide(type="text" value=user.orgIdsUserBelongs) + label + | {{_ 'teams'}} + i.fa.fa-plus-square#addUserTeamNewUser + i.fa.fa-minus-square#removeUserTeamNewUser + select.js-teamsNewUser#jsTeamsNewUser + option(value="-1") {{_ 'teams'}} : + each value in teamsDatas + option(value="{{value._id}}") {{_ value.teamDisplayName}} + input#jsUserTeamsInPutNewUser.js-userteamsNewUser(type="text" value=user.teamsUserBelongs, disabled) + input#jsUserTeamIdsInPutNewUser.js-userteamIdsNewUser.hide(type="text" value=user.teamIdsUserBelongs) + hr label | {{_ 'password'}} diff --git a/client/components/settings/peopleBody.js b/client/components/settings/peopleBody.js index 588a2b3a5..95b561cd7 100644 --- a/client/components/settings/peopleBody.js +++ b/client/components/settings/peopleBody.js @@ -1,6 +1,7 @@ const orgsPerPage = 25; const teamsPerPage = 25; const usersPerPage = 25; +let userOrgsTeamsAction = ""; //poosible actions 'addOrg', 'addTeam', 'removeOrg' or 'removeTeam' when adding or modifying a user BlazeComponent.extendComponent({ mixins() { @@ -247,6 +248,12 @@ Template.editUserPopup.helpers({ authentications() { return Template.instance().authenticationMethods.get(); }, + orgsDatas() { + return Org.find({}, {sort: { createdAt: -1 }}); + }, + teamsDatas() { + return Team.find({}, {sort: { createdAt: -1 }}); + }, isSelected(match) { const userId = Template.instance().data.userId; const selected = Users.findOne(userId).authenticationMethod; @@ -314,10 +321,21 @@ Template.newUserPopup.helpers({ authentications() { return Template.instance().authenticationMethods.get(); }, + orgsDatas() { + return Org.find({}, {sort: { createdAt: -1 }}); + }, + teamsDatas() { + return Team.find({}, {sort: { createdAt: -1 }}); + }, isSelected(match) { const userId = Template.instance().data.userId; - const selected = Users.findOne(userId).authenticationMethod; - return selected === match; + if(userId){ + const selected = Users.findOne(userId).authenticationMethod; + return selected === match; + } + else{ + false; + } }, isLdap() { const userId = Template.instance().data.userId; @@ -502,15 +520,13 @@ Template.editUserPopup.events({ const isAdmin = templateInstance.find('.js-profile-isadmin').value.trim(); const isActive = templateInstance.find('.js-profile-isactive').value.trim(); const email = templateInstance.find('.js-profile-email').value.trim(); - const verified = templateInstance - .find('.js-profile-email-verified') - .value.trim(); - const authentication = templateInstance - .find('.js-authenticationMethod') - .value.trim(); - const importUsernames = templateInstance - .find('.js-import-usernames') - .value.trim(); + const verified = templateInstance.find('.js-profile-email-verified').value.trim(); + const authentication = templateInstance.find('.js-authenticationMethod').value.trim(); + const importUsernames = templateInstance.find('.js-import-usernames').value.trim(); + const userOrgs = templateInstance.find('.js-userOrgs').value.trim(); + const userOrgsIds = templateInstance.find('.js-userOrgIds').value.trim(); + const userTeams = templateInstance.find('.js-userteams').value.trim(); + const userTeamsIds = templateInstance.find('.js-userteamIds').value.trim(); const isChangePassword = password.length > 0; const isChangeUserName = username !== user.username; @@ -535,6 +551,36 @@ Template.editUserPopup.events({ }, }); + let userTeamsList = userTeams.split(","); + let userTeamsIdsList = userTeamsIds.split(","); + let userTms = []; + for(let i = 0; i < userTeamsList.length; i++){ + userTms.push({ + "teamId": userTeamsIdsList[i], + "teamDisplayName": userTeamsList[i], + }) + } + Users.update(this.userId, { + $set:{ + teams: userTms + } + }); + + let userOrgsList = userOrgs.split(","); + let userOrgsIdsList = userOrgsIds.split(","); + let userOrganizations = []; + for(let i = 0; i < userOrgsList.length; i++){ + userOrganizations.push({ + "orgId": userOrgsIdsList[i], + "orgDisplayName": userOrgsList[i], + }) + } + Users.update(this.userId, { + $set:{ + orgs: userOrganizations + } + }); + if (isChangePassword) { Meteor.call('setPassword', password, this.userId); } @@ -602,8 +648,119 @@ Template.editUserPopup.events({ }); } else Popup.close(); }, + 'click #addUserOrg'(event) { + event.preventDefault(); + + userOrgsTeamsAction = "addOrg"; + document.getElementById("jsOrgs").style.display = 'block'; + document.getElementById("jsTeams").style.display = 'none'; + }, + 'click #removeUserOrg'(event) { + event.preventDefault(); + + userOrgsTeamsAction = "removeOrg"; + document.getElementById("jsOrgs").style.display = 'block'; + document.getElementById("jsTeams").style.display = 'none'; + }, + 'click #addUserTeam'(event) { + event.preventDefault(); + + userOrgsTeamsAction = "addTeam"; + document.getElementById("jsTeams").style.display = 'block'; + document.getElementById("jsOrgs").style.display = 'none'; + }, + 'click #removeUserTeam'(event) { + event.preventDefault(); + + userOrgsTeamsAction = "removeTeam"; + document.getElementById("jsTeams").style.display = 'block'; + document.getElementById("jsOrgs").style.display = 'none'; + }, + 'change #jsOrgs'(event) { + event.preventDefault(); + UpdateUserOrgsOrTeamsElement(); + }, + 'change #jsTeams'(event) { + event.preventDefault(); + UpdateUserOrgsOrTeamsElement(); + }, }); +UpdateUserOrgsOrTeamsElement = function(isNewUser = false){ + let selectedElt; + let selectedEltValue; + let selectedEltValueId; + let inputElt; + let inputEltId; + let lstInputValues = []; + let lstInputValuesIds = []; + let index; + let indexId; + switch(userOrgsTeamsAction) + { + case "addOrg": + case "removeOrg": + inputElt = !isNewUser ? document.getElementById("jsUserOrgsInPut") : document.getElementById("jsUserOrgsInPutNewUser"); + inputEltId = !isNewUser ? document.getElementById("jsUserOrgIdsInPut") : document.getElementById("jsUserOrgIdsInPutNewUser"); + selectedElt = !isNewUser ? document.getElementById("jsOrgs") : document.getElementById("jsOrgsNewUser"); + break; + case "addTeam": + case "removeTeam": + inputElt = !isNewUser ? document.getElementById("jsUserTeamsInPut") : document.getElementById("jsUserTeamsInPutNewUser"); + inputEltId = !isNewUser ? document.getElementById("jsUserTeamIdsInPut") : document.getElementById("jsUserTeamIdsInPutNewUser"); + selectedElt = !isNewUser ? document.getElementById("jsTeams") : document.getElementById("jsTeamsNewUser"); + break; + default: + break; + } + selectedEltValue = selectedElt.options[selectedElt.selectedIndex].text; + selectedEltValueId = selectedElt.options[selectedElt.selectedIndex].value; + lstInputValues = inputElt.value.trim().split(","); + if(lstInputValues.length == 1 && lstInputValues[0] == ''){ + lstInputValues = []; + } + lstInputValuesIds = inputEltId.value.trim().split(","); + if(lstInputValuesIds.length == 1 && lstInputValuesIds[0] == ''){ + lstInputValuesIds = []; + } + index = lstInputValues.indexOf(selectedEltValue); + indexId = lstInputValuesIds.indexOf(selectedEltValue); + if(userOrgsTeamsAction == "addOrg" || userOrgsTeamsAction == "addTeam"){ + if(index <= -1 && selectedEltValueId != "-1"){ + lstInputValues.push(selectedEltValue); + } + + if(indexId <= -1 && selectedEltValueId != "-1"){ + lstInputValuesIds.push(selectedEltValueId); + } + } + else{ + if(index > -1 && selectedEltValueId != "-1"){ + lstInputValues.splice(index, 1); + } + + if(indexId > -1 && selectedEltValueId != "-1"){ + lstInputValuesIds.splice(indexId, 1); + } + } + + if(lstInputValues.length > 0){ + inputElt.value = lstInputValues.join(","); + } + else{ + inputElt.value = ""; + } + + if(lstInputValuesIds.length > 0){ + inputEltId.value = lstInputValuesIds.join(","); + } + else{ + inputEltId.value = ""; + } + selectedElt.value = "-1"; + selectedElt.style.display = "none"; +} + Template.newOrgPopup.events({ submit(event, templateInstance) { event.preventDefault(); @@ -665,6 +822,30 @@ Template.newUserPopup.events({ const importUsernames = Users.parseImportUsernames( templateInstance.find('.js-import-usernames').value, ); + const userOrgs = templateInstance.find('.js-userOrgsNewUser').value.trim(); + const userOrgsIds = templateInstance.find('.js-userOrgIdsNewUser').value.trim(); + const userTeams = templateInstance.find('.js-userteamsNewUser').value.trim(); + const userTeamsIds = templateInstance.find('.js-userteamIdsNewUser').value.trim(); + + let userTeamsList = userTeams.split(","); + let userTeamsIdsList = userTeamsIds.split(","); + let userTms = []; + for(let i = 0; i < userTeamsList.length; i++){ + userTms.push({ + "teamId": userTeamsIdsList[i], + "teamDisplayName": userTeamsList[i], + }) + } + + let userOrgsList = userOrgs.split(","); + let userOrgsIdsList = userOrgsIds.split(","); + let userOrganizations = []; + for(let i = 0; i < userOrgsList.length; i++){ + userOrganizations.push({ + "orgId": userOrgsIdsList[i], + "orgDisplayName": userOrgsList[i], + }) + } Meteor.call( 'setCreateUser', @@ -676,6 +857,8 @@ Template.newUserPopup.events({ isActive, email.toLowerCase(), importUsernames, + userOrganizations, + userTms, function(error) { const usernameMessageElement = templateInstance.$('.username-taken'); const emailMessageElement = templateInstance.$('.email-taken'); @@ -697,6 +880,42 @@ Template.newUserPopup.events({ ); Popup.close(); }, + 'click #addUserOrgNewUser'(event) { + event.preventDefault(); + + userOrgsTeamsAction = "addOrg"; + document.getElementById("jsOrgsNewUser").style.display = 'block'; + document.getElementById("jsTeamsNewUser").style.display = 'none'; + }, + 'click #removeUserOrgNewUser'(event) { + event.preventDefault(); + + userOrgsTeamsAction = "removeOrg"; + document.getElementById("jsOrgsNewUser").style.display = 'block'; + document.getElementById("jsTeamsNewUser").style.display = 'none'; + }, + 'click #addUserTeamNewUser'(event) { + event.preventDefault(); + + userOrgsTeamsAction = "addTeam"; + document.getElementById("jsTeamsNewUser").style.display = 'block'; + document.getElementById("jsOrgsNewUser").style.display = 'none'; + }, + 'click #removeUserTeamNewUser'(event) { + event.preventDefault(); + + userOrgsTeamsAction = "removeTeam"; + document.getElementById("jsTeamsNewUser").style.display = 'block'; + document.getElementById("jsOrgsNewUser").style.display = 'none'; + }, + 'change #jsOrgsNewUser'(event) { + event.preventDefault(); + UpdateUserOrgsOrTeamsElement(true); + }, + 'change #jsTeamsNewUser'(event) { + event.preventDefault(); + UpdateUserOrgsOrTeamsElement(true); + }, }); Template.settingsUserPopup.events({ diff --git a/client/components/settings/peopleBody.styl b/client/components/settings/peopleBody.styl index 028db164c..8ef33c9e0 100644 --- a/client/components/settings/peopleBody.styl +++ b/client/components/settings/peopleBody.styl @@ -49,3 +49,9 @@ table .more-settings-user,.more-settings-team,.more-settings-org margin-left: 10px; + +.js-orgs,.js-orgsNewUser + display: none; + +.js-teams,.js-teamsNewUser + display: none; diff --git a/models/users.js b/models/users.js index d2f2d6ef9..58cad3bf7 100644 --- a/models/users.js +++ b/models/users.js @@ -38,6 +38,44 @@ Users.attachSchema( } }, }, + orgs: { + /** + * the list of organizations that a user belongs to + */ + type: [Object], + optional: true, + }, + 'orgs.$.orgId':{ + /** + * The uniq ID of the organization + */ + type: String, + }, + 'orgs.$.orgDisplayName':{ + /** + * The display name of the organization + */ + type: String, + }, + teams: { + /** + * the list of teams that a user belongs to + */ + type: [Object], + optional: true, + }, + 'teams.$.teamId':{ + /** + * The uniq ID of the team + */ + type: String, + }, + 'teams.$.teamDisplayName':{ + /** + * The display name of the team + */ + type: String, + }, emails: { /** * the list of emails attached to a user @@ -329,13 +367,7 @@ Users.attachSchema( }, 'sessionData.totalHits': { /** - * Total hits from last search - */ - type: Number, - optional: true, - }, - 'sessionData.lastHit': { - /** + * Total hits from last searchquery['members.userId'] = Meteor.userId(); * last hit that was returned */ type: Number, @@ -464,7 +496,30 @@ Users.helpers({ } return ''; }, - + orgsUserBelongs() { + if (this.orgs) { + return this.orgs.map(function(org){return org.orgDisplayName}).join(','); + } + return ''; + }, + orgIdsUserBelongs() { + if (this.orgs) { + return this.orgs.map(function(org){return org.orgId}).join(','); + } + return ''; + }, + teamsUserBelongs() { + if (this.teams) { + return this.teams.map(function(team){ return team.teamDisplayName}).join(','); + } + return ''; + }, + teamIdsUserBelongs() { + if (this.teams) { + return this.teams.map(function(team){ return team.teamId}).join(','); + } + return ''; + }, boards() { return Boards.find( { @@ -894,6 +949,8 @@ if (Meteor.isServer) { isActive, email, importUsernames, + userOrgsArray, + userTeamsArray, ) { if (Meteor.user() && Meteor.user().isAdmin) { check(fullname, String); @@ -904,6 +961,8 @@ if (Meteor.isServer) { check(isActive, String); check(email, String); check(importUsernames, Array); + check(userOrgsArray, Array); + check(userTeamsArray, Array); const nUsersWithUsername = Users.find({ username, @@ -935,6 +994,8 @@ if (Meteor.isServer) { 'profile.fullname': fullname, importUsernames, 'profile.initials': initials, + orgs: userOrgsArray, + teams: userTeamsArray, }, }); } diff --git a/server/publications/people.js b/server/publications/people.js index b2318287c..af8dfcea5 100644 --- a/server/publications/people.js +++ b/server/publications/people.js @@ -21,6 +21,8 @@ Meteor.publish('people', function(query, limit) { loginDisabled: 1, authenticationMethod: 1, importUsernames: 1, + orgs: 1, + teams: 1, }, }); } From d6e11940cc8cc548411fc675d5a51efd97a0393a Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 10 Jun 2021 21:52:05 +0300 Subject: [PATCH 03/81] Updated ChangeLog. --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f57e1b603..379565dc7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ [Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac) +# Upcoming Wekan release + +This release adds the following new improvements: + +- [Custom Fields stringtemplate, autofocus the last input box](https://github.com/wekan/wekan/pull/3849). + Thanks to mfilser. + +Thanks to above GitHub users for their contributions and translators for their translations. + # v5.32 2021-06-09 Wekan release This release adds the following new features: From b769d18f7311ad3185767d92d7d1f83538bebdc4 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 10 Jun 2021 22:01:14 +0300 Subject: [PATCH 04/81] Updated ChangeLog. --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 379565dc7..1d7728ad6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,12 @@ # Upcoming Wekan release -This release adds the following new improvements: +This release adds the following new features: + +- [Assigning a user to a team or an organization](https://github.com/wekan/wekan/pull/3850). + Thanks to Emile840. + +and adds the following new improvements: - [Custom Fields stringtemplate, autofocus the last input box](https://github.com/wekan/wekan/pull/3849). Thanks to mfilser. From c5d8117052d0725c25aae3176a3043645edefbcf Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 10 Jun 2021 22:03:45 +0300 Subject: [PATCH 05/81] Updated translations. --- i18n/fr.i18n.json | 8 ++++---- i18n/he.i18n.json | 8 ++++---- i18n/it.i18n.json | 26 +++++++++++++------------- i18n/pt-BR.i18n.json | 16 ++++++++-------- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json index 8c42f32ba..604b57cdf 100644 --- a/i18n/fr.i18n.json +++ b/i18n/fr.i18n.json @@ -82,8 +82,8 @@ "add-attachment": "Ajouter une pièce jointe", "add-board": "Ajouter un tableau", "add-card": "Ajouter une carte", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-card-to-top-of-list": "Ajouter la carte en haut de la liste", + "add-card-to-bottom-of-list": "Ajouter la carte en bas de la liste", "add-swimlane": "Ajouter un couloir", "add-subtask": "Ajouter une sous-tâche", "add-checklist": "Ajouter une checklist", @@ -133,7 +133,7 @@ "board-not-found": "Tableau non trouvé", "board-private-info": "Ce tableau sera privé", "board-public-info": "Ce tableau sera public.", - "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "board-drag-drop-reorder-or-click-open": "Glisser-déposer les icônes de tableau pour les réordonner. Cliquer sur l'icône du tableau pour l'ouvrir.", "boardChangeColorPopup-title": "Change la couleur de fond du tableau", "boardChangeTitlePopup-title": "Renommer le tableau", "boardChangeVisibilityPopup-title": "Changer la visibilité", @@ -233,7 +233,7 @@ "close": "Fermer", "close-board": "Fermer le tableau", "close-board-pop": "Vous pouvez restaurer le tableau en cliquant sur le bouton « Archives » depuis le menu en entête.", - "close-card": "Close Card", + "close-card": "Fermer la carte", "color-black": "noir", "color-blue": "bleu", "color-crimson": "rouge cramoisi", diff --git a/i18n/he.i18n.json b/i18n/he.i18n.json index bc8fd4dd8..d055e1030 100644 --- a/i18n/he.i18n.json +++ b/i18n/he.i18n.json @@ -82,8 +82,8 @@ "add-attachment": "הוספת קובץ מצורף", "add-board": "הוספת לוח", "add-card": "הוספת כרטיס", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-card-to-top-of-list": "הוספת כרטיס לראש הרשימה", + "add-card-to-bottom-of-list": "הוספת כרטיס לתחתית הרשימה", "add-swimlane": "הוספת מסלול", "add-subtask": "הוסף תת משימה", "add-checklist": "הוספת רשימת מטלות", @@ -133,7 +133,7 @@ "board-not-found": "לוח לא נמצא", "board-private-info": "לוח זה יהיה פרטי.", "board-public-info": "לוח זה יהיה ציבורי.", - "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "board-drag-drop-reorder-or-click-open": "יש לגרור ולסדר מחדש את סמלי הלוח. לחיצה על סמל הלוח תפתח אותו.", "boardChangeColorPopup-title": "שינוי רקע ללוח", "boardChangeTitlePopup-title": "שינוי שם הלוח", "boardChangeVisibilityPopup-title": "שינוי מצב הצגה", @@ -233,7 +233,7 @@ "close": "סגירה", "close-board": "סגירת לוח", "close-board-pop": "ניתן לשחזר את הלוח בלחיצה על כפתור „ארכיונים“ מהכותרת העליונה.", - "close-card": "Close Card", + "close-card": "סגירת כרטיס", "color-black": "שחור", "color-blue": "כחול", "color-crimson": "שני", diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json index 9ffcd4744..e27e388f0 100644 --- a/i18n/it.i18n.json +++ b/i18n/it.i18n.json @@ -82,8 +82,8 @@ "add-attachment": "Aggiungi allegato", "add-board": "Aggiungi bacheca", "add-card": "Aggiungi scheda", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-card-to-top-of-list": "Aggiungi Scheda in cima alla Lista", + "add-card-to-bottom-of-list": "Aggiungi Scheda in fondo alla Lista", "add-swimlane": "Aggiungi swimlane", "add-subtask": "Aggiungi sotto-compito", "add-checklist": "Aggiungi Checklist", @@ -195,11 +195,11 @@ "poker-forty": "40", "poker-oneHundred": "100", "poker-unsure": "?", - "poker-finish": "Finish", - "poker-result-votes": "Votes", - "poker-result-who": "Who", + "poker-finish": "Fine", + "poker-result-votes": "Voti", + "poker-result-who": "Chi", "poker-replay": "Replay", - "set-estimation": "Set Estimation", + "set-estimation": "Imposta la stima", "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Eliminare scheda?", @@ -233,7 +233,7 @@ "close": "Chiudi", "close-board": "Chiudi bacheca", "close-board-pop": "Potrai ripristinare la bacheca cliccando sul tasto \"Archivio\" presente nell'intestazione della home.", - "close-card": "Close Card", + "close-card": "Chiudi Scheda", "color-black": "nero", "color-blue": "blu", "color-crimson": "Rosso cremisi", @@ -370,12 +370,12 @@ "list-label-short-sort": "(M)", "filter": "Filtra", "filter-cards": "Filtra schede o liste", - "filter-dates-label": "Filter by date", - "filter-no-due-date": "No due date", - "filter-overdue": "Overdue", - "filter-due-today": "Due today", - "filter-due-this-week": "Due this week", - "filter-due-tomorrow": "Due tomorrow", + "filter-dates-label": "Filtra per data", + "filter-no-due-date": "Senza data scadenza", + "filter-overdue": "Scaduta", + "filter-due-today": "Scade oggi", + "filter-due-this-week": "Scade questa settimana", + "filter-due-tomorrow": "Scade domani", "list-filter-label": "Filtra lista per titolo", "filter-clear": "Pulisci filtri", "filter-labels-label": "Filtra secondo l'etichetta", diff --git a/i18n/pt-BR.i18n.json b/i18n/pt-BR.i18n.json index c401858b2..b1cf49060 100644 --- a/i18n/pt-BR.i18n.json +++ b/i18n/pt-BR.i18n.json @@ -82,8 +82,8 @@ "add-attachment": "Adicionar Anexos", "add-board": "Adicionar Quadro", "add-card": "Adicionar Cartão", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-card-to-top-of-list": "Adicionar Cartão no Topo da Lista", + "add-card-to-bottom-of-list": "Adicionar Cartão no Final da Lista", "add-swimlane": "Adicionar Raia", "add-subtask": "Adicionar subtarefa", "add-checklist": "Adicionar lista de verificação", @@ -133,7 +133,7 @@ "board-not-found": "Quadro não encontrado", "board-private-info": "Este quadro será privado.", "board-public-info": "Este quadro será público.", - "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "board-drag-drop-reorder-or-click-open": "Arraste e solte para reordenar os ícones do quadro. Clique no ícone do quadro para abri-lo. ", "boardChangeColorPopup-title": "Alterar Tela de Fundo", "boardChangeTitlePopup-title": "Renomear Quadro", "boardChangeVisibilityPopup-title": "Alterar Visibilidade", @@ -233,7 +233,7 @@ "close": "Fechar", "close-board": "Fechar Quadro", "close-board-pop": "Você será capaz de restaurar o quadro clicando no botão “Arquivo morto” a partir do cabeçalho do Início.", - "close-card": "Close Card", + "close-card": "Fechar Cartão", "color-black": "preto", "color-blue": "azul", "color-crimson": "carmesim", @@ -447,8 +447,8 @@ "set-color-list": "Definir Cor", "listActionPopup-title": "Listar Ações", "settingsUserPopup-title": "Configurações do usuário", - "settingsTeamPopup-title": "Team Settings", - "settingsOrgPopup-title": "Organization Settings", + "settingsTeamPopup-title": "Configurações do Time", + "settingsOrgPopup-title": "Configurações da Organização", "swimlaneActionPopup-title": "Ações de Raia", "swimlaneAddPopup-title": "Adicionar uma Raia abaixo", "listImportCardPopup-title": "Importe um cartão do Trello", @@ -845,8 +845,8 @@ "act-duenow": "está lembrando que o prazo final (__timeValue__) do __card__ é agora", "act-atUserComment": "Você foi mencionado no [__board__] __list__/__card__", "delete-user-confirm-popup": "Você realmente quer apagar esta conta? Não há como desfazer.", - "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", - "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "delete-team-confirm-popup": "Você tem certeza que quer excluir este time? Não há como desfazer.", + "delete-org-confirm-popup": "Você tem certeza que quer excluir esta organização? Não há como desfazer.", "accounts-allowUserDelete": "Permitir que usuários apaguem a própria conta", "hide-minicard-label-text": "Esconder rótulo da etiqueta do mini cartão", "show-desktop-drag-handles": "Mostrar alças de arrasto da área de trabalho", From d08b208bc6f62e8f86a8be8d705aa3b1d0351d11 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 10 Jun 2021 22:10:34 +0300 Subject: [PATCH 06/81] v5.33 --- CHANGELOG.md | 2 +- Stackerfile.yml | 2 +- package-lock.json | 2 +- package.json | 2 +- public/api/wekan.html | 167 ++++++++++++++++++++++++++++++++++++----- public/api/wekan.yml | 49 ++++++++++-- sandstorm-pkgdef.capnp | 4 +- snapcraft.yaml | 2 +- 8 files changed, 200 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d7728ad6..2e1b1d098 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ [Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac) -# Upcoming Wekan release +# v5.33 2021-06-10 Wekan release This release adds the following new features: diff --git a/Stackerfile.yml b/Stackerfile.yml index 18a99946c..bb76927dc 100644 --- a/Stackerfile.yml +++ b/Stackerfile.yml @@ -1,5 +1,5 @@ appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928 -appVersion: "v5.32.0" +appVersion: "v5.33.0" files: userUploads: - README.md diff --git a/package-lock.json b/package-lock.json index 281baa4fa..ca1a17125 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v5.32.0", + "version": "v5.33.0", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/package.json b/package.json index ee8208d7b..d03d4ea44 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v5.32.0", + "version": "v5.33.0", "description": "Open-Source kanban", "private": true, "repository": { diff --git a/public/api/wekan.html b/public/api/wekan.html index abfb472d5..825c81e24 100644 --- a/public/api/wekan.html +++ b/public/api/wekan.html @@ -7,7 +7,7 @@ - Wekan REST API v5.32 + Wekan REST API v5.33 @@ -1488,6 +1488,8 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc + + @@ -1551,7 +1553,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
  • - Wekan REST API v5.32 + Wekan REST API v5.33
  • @@ -2079,6 +2081,16 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc +
  • + UsersOrgs + +
  • + +
  • + UsersTeams + +
  • +
  • UsersEmails @@ -2104,7 +2116,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
    -

    Wekan REST API v5.32

    +

    Wekan REST API v5.33

    Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

    @@ -15959,6 +15971,18 @@ System.out.println(response.toString());
    {
       "username": "string",
    +  "orgs": [
    +    {
    +      "orgId": "string",
    +      "orgDisplayName": "string"
    +    }
    +  ],
    +  "teams": [
    +    {
    +      "teamId": "string",
    +      "teamDisplayName": "string"
    +    }
    +  ],
       "emails": [
         {
           "address": "string",
    @@ -16008,8 +16032,7 @@ System.out.println(response.toString());
       "loginDisabled": true,
       "authenticationMethod": "string",
       "sessionData": {
    -    "totalHits": 0,
    -    "lastHit": 0
    +    "totalHits": 0
       },
       "importUsernames": [
         "string"
    @@ -16700,6 +16723,18 @@ System.out.println(response.toString());
     
     
    {
       "username": "string",
    +  "orgs": [
    +    {
    +      "orgId": "string",
    +      "orgDisplayName": "string"
    +    }
    +  ],
    +  "teams": [
    +    {
    +      "teamId": "string",
    +      "teamDisplayName": "string"
    +    }
    +  ],
       "emails": [
         {
           "address": "string",
    @@ -16749,8 +16784,7 @@ System.out.println(response.toString());
       "loginDisabled": true,
       "authenticationMethod": "string",
       "sessionData": {
    -    "totalHits": 0,
    -    "lastHit": 0
    +    "totalHits": 0
       },
       "importUsernames": [
         "string"
    @@ -20712,6 +20746,18 @@ UserSecurity
     

    {
       "username": "string",
    +  "orgs": [
    +    {
    +      "orgId": "string",
    +      "orgDisplayName": "string"
    +    }
    +  ],
    +  "teams": [
    +    {
    +      "teamId": "string",
    +      "teamDisplayName": "string"
    +    }
    +  ],
       "emails": [
         {
           "address": "string",
    @@ -20761,8 +20807,7 @@ UserSecurity
       "loginDisabled": true,
       "authenticationMethod": "string",
       "sessionData": {
    -    "totalHits": 0,
    -    "lastHit": 0
    +    "totalHits": 0
       },
       "importUsernames": [
         "string"
    @@ -20791,6 +20836,20 @@ UserSecurity
     the username of the user
     
     
    +orgs
    +[UsersOrgs]¦null
    +false
    +none
    +the list of organizations that a user belongs to
    +
    +
    +teams
    +[UsersTeams]¦null
    +false
    +none
    +the list of teams that a user belongs to
    +
    +
     emails
     [UsersEmails]¦null
     false
    @@ -21131,8 +21190,7 @@ UserSecurity
     
     

    {
    -  "totalHits": 0,
    -  "lastHit": 0
    +  "totalHits": 0
     }
     
     
    @@ -21153,14 +21211,85 @@ UserSecurity number false none -Total hits from last search +Total hits from last searchquery['members.userId'] = Meteor.userId();
    last hit that was returned + + + +

    UsersOrgs

    +

    + + +

    +
    {
    +  "orgId": "string",
    +  "orgDisplayName": "string"
    +}
    +
    +
    +

    Properties

    + + + + + + + + + + + + + + + + + - - - + + + - + + + +
    NameTypeRequiredRestrictionsDescription
    orgIdstringtruenoneThe uniq ID of the organization
    lastHitnumberfalseorgDisplayNamestringtrue nonelast hit that was returnedThe display name of the organization
    +

    UsersTeams

    +

    + + +

    +
    {
    +  "teamId": "string",
    +  "teamDisplayName": "string"
    +}
    +
    +
    +

    Properties

    + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeRequiredRestrictionsDescription
    teamIdstringtruenoneThe uniq ID of the team
    teamDisplayNamestringtruenoneThe display name of the team
    @@ -21175,7 +21304,7 @@ UserSecurity }
    -

    Properties

    +

    Properties

    @@ -21214,7 +21343,7 @@ UserSecurity } -

    Properties

    +

    Properties

    @@ -21265,6 +21394,8 @@ UserSecurity + +
    diff --git a/public/api/wekan.yml b/public/api/wekan.yml index b06a9bc0a..e65da329d 100644 --- a/public/api/wekan.yml +++ b/public/api/wekan.yml @@ -1,7 +1,7 @@ swagger: '2.0' info: title: Wekan REST API - version: v5.32 + version: v5.33 description: | The REST API allows you to control and extend Wekan with ease. @@ -3738,6 +3738,20 @@ definitions: the username of the user type: string x-nullable: true + orgs: + description: | + the list of organizations that a user belongs to + type: array + items: + $ref: "#/definitions/UsersOrgs" + x-nullable: true + teams: + description: | + the list of teams that a user belongs to + type: array + items: + $ref: "#/definitions/UsersTeams" + x-nullable: true emails: description: | the list of emails attached to a user @@ -3921,12 +3935,37 @@ definitions: properties: totalHits: description: | - Total hits from last search - type: number - lastHit: - description: | + Total hits from last searchquery['members.userId'] = Meteor.userId(); last hit that was returned type: number + UsersOrgs: + type: object + properties: + orgId: + description: | + The uniq ID of the organization + type: string + orgDisplayName: + description: | + The display name of the organization + type: string + required: + - orgId + - orgDisplayName + UsersTeams: + type: object + properties: + teamId: + description: | + The uniq ID of the team + type: string + teamDisplayName: + description: | + The display name of the team + type: string + required: + - teamId + - teamDisplayName UsersEmails: type: object properties: diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index 954d6ba88..358d534f3 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 = 532, + appVersion = 533, # Increment this for every release. - appMarketingVersion = (defaultText = "5.32.0~2021-06-09"), + appMarketingVersion = (defaultText = "5.33.0~2021-06-10"), # Human-readable presentation of the app version. minUpgradableAppVersion = 0, diff --git a/snapcraft.yaml b/snapcraft.yaml index ebcddc7dc..7ff85a134 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -1,5 +1,5 @@ name: wekan -version: '5.32' +version: '5.33' summary: The open-source kanban description: | Wekan is an open-source and collaborative kanban board application. From 665d7eb8310e376ab965ac4571c0deee18c785a3 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Wed, 14 Apr 2021 18:55:29 +0200 Subject: [PATCH 07/81] Card Description has now the same color on editing --- client/components/cards/cardDescription.styl | 1 - 1 file changed, 1 deletion(-) diff --git a/client/components/cards/cardDescription.styl b/client/components/cards/cardDescription.styl index 5af497c77..fb4cbf23d 100644 --- a/client/components/cards/cardDescription.styl +++ b/client/components/cards/cardDescription.styl @@ -23,7 +23,6 @@ background-color: #fff border: 0 box-shadow: 0 1px 2px rgba(0, 0, 0, .23) - color: #8c8c8c height: 36px margin: 4px 4px 6px 0 padding: 9px 11px From 4caa0e2f2e99502b1638d888fbcf9a2468105621 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 10 Jun 2021 23:06:49 +0300 Subject: [PATCH 08/81] Updated ChangeLog. --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e1b1d098..40931d099 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ [Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac) +# Upcoming Wekan release + +This release adds the following new improvements: + +- [Card Description has now the same color on view and editing](https://github.com/wekan/wekan/pull/3851). + Thanks to mfilser. + +Thanks to above GitHub users for their contributions and translators for their translations. + # v5.33 2021-06-10 Wekan release This release adds the following new features: From 2a5147a0c173e8610269a6a0d826dab7c2ca3faf Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 10 Jun 2021 23:30:13 +0300 Subject: [PATCH 09/81] Updated Docker Ubuntu base image to newest hirsute. Thanks to xet7 ! --- .devcontainer/Dockerfile | 2 +- Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index d355516b4..0e0469003 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,4 +1,4 @@ -FROM quay.io/wekan/ubuntu:groovy-20201125.2 +FROM quay.io/wekan/ubuntu:hirsute-20210522 LABEL maintainer="sgr" # 2020-12-03: diff --git a/Dockerfile b/Dockerfile index 6ba008bad..3ed9e9627 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM quay.io/wekan/ubuntu:groovy-20210115 +FROM quay.io/wekan/ubuntu:hirsute-20210522 LABEL maintainer="wekan" # 2020-12-03: From 09a060a57bd35d6c461026513516eafb75a97b75 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Thu, 10 Jun 2021 23:31:59 +0300 Subject: [PATCH 10/81] Updated ChangeLog. --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 40931d099..6e92ecb31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ This release adds the following new improvements: - [Card Description has now the same color on view and editing](https://github.com/wekan/wekan/pull/3851). Thanks to mfilser. +and adds the following updates: + +- [Updated Docker Ubuntu base image to newest hirsute](https://github.com/wekan/wekan/commit/2a5147a0c173e8610269a6a0d826dab7c2ca3faf). + Thanks to xet7. + Thanks to above GitHub users for their contributions and translators for their translations. # v5.33 2021-06-10 Wekan release From 0b34bcdfa8d8c1c53580bdd07e5fedc3cfb2b739 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 11 Jun 2021 00:26:47 +0300 Subject: [PATCH 11/81] Updated Dockerfile gpg to gpgv2, that package is in hirsute. Thanks to xet7 ! --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 3ed9e9627..90dd4a02e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,7 @@ LABEL maintainer="wekan" # ENV BUILD_DEPS="paxctl" ARG DEBIAN_FRONTEND=noninteractive -ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-essential git ca-certificates python3" \ +ENV BUILD_DEPS="apt-utils libarchive-tools gpgv2 gosu wget curl bzip2 g++ build-essential git ca-certificates python3" \ DEBUG=false \ NODE_VERSION=v12.22.1 \ METEOR_RELEASE=1.10.2 \ From df74b3154164410d79e377f629bb92e068a89bd2 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 11 Jun 2021 00:34:27 +0300 Subject: [PATCH 12/81] Try different gpg package for Docker and Hirsute. Thanks to xet7 ! --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 90dd4a02e..55493f64e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,7 @@ LABEL maintainer="wekan" # ENV BUILD_DEPS="paxctl" ARG DEBIAN_FRONTEND=noninteractive -ENV BUILD_DEPS="apt-utils libarchive-tools gpgv2 gosu wget curl bzip2 g++ build-essential git ca-certificates python3" \ +ENV BUILD_DEPS="apt-utils libarchive-tools gnupg2 gosu wget curl bzip2 g++ build-essential git ca-certificates python3" \ DEBUG=false \ NODE_VERSION=v12.22.1 \ METEOR_RELEASE=1.10.2 \ From 6bf6bcb19211077a5fd170990fd4f28d55fd5c4b Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 11 Jun 2021 00:43:45 +0300 Subject: [PATCH 13/81] Revert upgrading Dockerfile to hirsute, because of bug: https://github.com/wekan/wekan/pull/3852#issuecomment-859095850 Thanks to xet7 ! --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 55493f64e..6ba008bad 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM quay.io/wekan/ubuntu:hirsute-20210522 +FROM quay.io/wekan/ubuntu:groovy-20210115 LABEL maintainer="wekan" # 2020-12-03: @@ -10,7 +10,7 @@ LABEL maintainer="wekan" # ENV BUILD_DEPS="paxctl" ARG DEBIAN_FRONTEND=noninteractive -ENV BUILD_DEPS="apt-utils libarchive-tools gnupg2 gosu wget curl bzip2 g++ build-essential git ca-certificates python3" \ +ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-essential git ca-certificates python3" \ DEBUG=false \ NODE_VERSION=v12.22.1 \ METEOR_RELEASE=1.10.2 \ From 5697b89817951b253fc515e5f70c33fafcf9f85c Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Sun, 25 Apr 2021 11:18:11 +0200 Subject: [PATCH 14/81] .devcontainer now ready for Wekan Development in Docker Container Check .devcontainer/docker-compose.yml to fit your environment Enter this commands to start Wekan Development: $ cd .devcontainer $ docker-compose build $ docker-compose up -d Visit localhost:3000 or whatever you entered in ROOT_URL Code changes triggers a rebuild / redeploy --- .devcontainer/Dockerfile | 76 +++++++++++++++++++++++++------- .devcontainer/docker-compose.yml | 11 +++-- .dockerignore | 34 ++++++++++++++ .gitignore | 1 + 4 files changed, 103 insertions(+), 19 deletions(-) create mode 100644 .dockerignore diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 0e0469003..734c132ed 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,10 +1,6 @@ -FROM quay.io/wekan/ubuntu:hirsute-20210522 +FROM debian LABEL maintainer="sgr" -# 2020-12-03: -# - Above Ubuntu base image copied from Docker Hub ubuntu:groovy-20201125.2 -# to Quay to avoid Docker Hub rate limits. - ENV BUILD_DEPS="gnupg gosu bsdtar wget curl bzip2 g++ build-essential python git ca-certificates iproute2" ENV DEBIAN_FRONTEND=noninteractive @@ -140,17 +136,17 @@ ENV \ RUN set -o xtrace \ && useradd --user-group -m --system --home-dir /home/wekan wekan \ && apt-get update \ - && apt-get install --assume-yes --no-install-recommends apt-utils apt-transport-https ca-certificates 2>&1 \ - && apt-get install --assume-yes --no-install-recommends ${BUILD_DEPS} + && apt-get install --assume-yes --no-install-recommends apt-utils apt-transport-https ca-certificates 2>&1 \ + && apt-get install --assume-yes --no-install-recommends ${BUILD_DEPS} # Install NodeJS RUN set -o xtrace \ && cd /tmp \ - && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-$ARCHITECTURE.tar.xz" \ - && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ - && grep " node-v$NODE_VERSION-$ARCHITECTURE.tar.xz\$" SHASUMS256.txt.asc | sha256sum -c - \ - && tar -xJf "node-v$NODE_VERSION-$ARCHITECTURE.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \ - && rm "node-v$NODE_VERSION-$ARCHITECTURE.tar.xz" SHASUMS256.txt.asc \ + && curl -fsSLO --compressed "https://nodejs.org/dist/$NODE_VERSION/node-$NODE_VERSION-$ARCHITECTURE.tar.xz" \ + && curl -fsSLO --compressed "https://nodejs.org/dist/$NODE_VERSION/SHASUMS256.txt.asc" \ + && grep " node-$NODE_VERSION-$ARCHITECTURE.tar.xz\$" SHASUMS256.txt.asc | sha256sum -c - \ + && tar -xJf "node-$NODE_VERSION-$ARCHITECTURE.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \ + && rm "node-$NODE_VERSION-$ARCHITECTURE.tar.xz" SHASUMS256.txt.asc \ && ln -s /usr/local/bin/node /usr/local/bin/nodejs \ && mkdir -p /usr/local/lib/node_modules/fibers/.node-gyp /root/.node-gyp/${NODE_VERSION} /home/wekan/.config \ && npm install -g npm@${NPM_VERSION} \ @@ -172,17 +168,65 @@ RUN set -o xtrace \ ENV PATH=$PATH:/home/wekan/.meteor/ -# Copy source dir USER root RUN echo "export PATH=$PATH" >> /etc/environment -RUN set -o xtrace \ - && mkdir /home/wekan/app +USER wekan -COPY ${SRC_PATH} /home/wekan/app/ +# Copy source dir +RUN set -o xtrace \ + && mkdir -p /home/wekan/app/.meteor \ + && mkdir -p /home/wekan/app/packages + +COPY \ + .meteor/.finished-upgraders \ + .meteor/.id \ + .meteor/cordova-plugins \ + .meteor/packages \ + .meteor/platforms \ + .meteor/release \ + .meteor/versions \ + /home/wekan/app/.meteor/ + +COPY \ + package.json \ + settings.json \ + /home/wekan/app/ + +COPY \ + packages \ + /home/wekan/app/packages/ + +USER root RUN set -o xtrace \ && chown -R wekan:wekan /home/wekan/app /home/wekan/.meteor USER wekan + +RUN \ + set -o xtrace && \ + sed -i 's/api\.versionsFrom/\/\/api.versionsFrom/' /home/wekan/app/packages/meteor-useraccounts-core/package.js && \ + cd /home/wekan/.meteor && \ + /home/wekan/.meteor/meteor -- help; + +RUN \ + set -o xtrace && \ + # Build app + cd /home/wekan/app && \ + /home/wekan/.meteor/meteor add standard-minifier-js && \ + /home/wekan/.meteor/meteor npm install && \ + /home/wekan/.meteor/meteor build --directory /home/wekan/app_build + +RUN \ + set -o xtrace && \ + cd /home/wekan/app_build/bundle/programs/server/ && \ + chmod u+w package.json npm-shrinkwrap.json && \ + npm install + +ENV PORT=3000 +EXPOSE $PORT +WORKDIR /home/wekan/app + +CMD ["/home/wekan/.meteor/meteor", "run", "--verbose", "--settings", "settings.json"] diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index fab770560..9a21bbfd6 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -14,6 +14,7 @@ services: volumes: - wekan-dev-db:/data/db - wekan-dev-db-dump:/dump + - /etc/localtime:/etc/localtime:ro wekan-dev: container_name: wekan-dev-app @@ -35,9 +36,13 @@ services: depends_on: - wekandb-dev volumes: - - ..:/app:delegated - command: - sleep infinity + - ../client:/home/wekan/app/client + - ../models:/home/wekan/app/models + - ../config:/home/wekan/app/config + - ../i18n:/home/wekan/app/i18n + - ../server:/home/wekan/app/server + - ../public:/home/wekan/app/public + - /etc/localtime:/etc/localtime:ro volumes: wekan-dev-db: diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..7037d0625 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,34 @@ +*~ +*.swp +.meteor-spk +*.sublime-workspace +tmp/ +node_modules/ +npm-debug.log +.gitmodules +.vscode/ +.idea/ +.build/* +**/parts/ +**/stage +**/prime +**/*.snap +snap/.snapcraft/ +.idea +.DS_Store +.DS_Store? +.build* +*.browserify.js.cached +*.browserify.js.map +.build* +versions.json +.versions +.npm +.build* +._* +.Trashes +Thumbs.db +ehthumbs.db +.eslintcache +.meteor/local +.devcontainer/docker-compose.extend.yml diff --git a/.gitignore b/.gitignore index 7037d0625..b108de038 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ ehthumbs.db .eslintcache .meteor/local .devcontainer/docker-compose.extend.yml +.devcontainer/volumes*/ From bbd3324b79b66dc77e08f9c389dae24ab50d20d3 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Thu, 10 Jun 2021 19:34:43 +0200 Subject: [PATCH 15/81] ignore .git directory at docker build - COPY copies the .git directory to the image. The docker build then stops with this error: => Errors while initializing project: While building package wekan-cfs-data-man: error: couldn't install npm package request@https://github.com/wekan/request: Command failed: /home/wekan/.meteor/packages/meteor-tool/.2.2.0.1j8auib.qcbe++os.linux.x86_64+web.browser+web.browser.legacy+web.cordova/mt-os.linux.x86_64/dev_bundle/bin/npm install https://github.com/wekan/request npm ERR! Error while executing: npm ERR! /usr/bin/git ls-remote -h -t https://github.com/wekan/request.git npm ERR! npm ERR! fatal: not a git repository: /home/wekan/app/../.git/modules/src npm ERR! npm ERR! exited with error code: 128 npm ERR! A complete log of this run can be found in: npm ERR! /home/wekan/.npm/_logs/2021-06-10T12_54_02_777Z-debug.log npm ERR! Error while executing: npm ERR! /usr/bin/git ls-remote -h -t https://github.com/wekan/request.git npm ERR! npm ERR! fatal: not a git repository: /home/wekan/app/../.git/modules/src npm ERR! npm ERR! exited with error code: 128 npm ERR! A complete log of this run can be found in: npm ERR! /home/wekan/.npm/_logs/2021-06-10T12_54_02_777Z-debug.log --- .dockerignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.dockerignore b/.dockerignore index 7037d0625..c6d1be4fd 100644 --- a/.dockerignore +++ b/.dockerignore @@ -32,3 +32,4 @@ ehthumbs.db .eslintcache .meteor/local .devcontainer/docker-compose.extend.yml +.git From 6d2f8a97af6f7e27e1d5a5645c334ecdce3816ea Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Thu, 10 Jun 2021 22:28:03 +0200 Subject: [PATCH 16/81] Base Image of Development and Build are now the same - libarchive-tools contains bsdtar. bsdtar is needed for meteor installation, it doesn't / or didn't work with docker and overlayfs. see also here: https://github.com/jshimko/meteor-launchpad/issues/39 https://github.com/anchore/anchore-engine/issues/106 https://github.com/coreos/bugs/issues/1095 --- .devcontainer/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 734c132ed..f8ea94911 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,7 +1,7 @@ -FROM debian +FROM quay.io/wekan/ubuntu:groovy-20210115 LABEL maintainer="sgr" -ENV BUILD_DEPS="gnupg gosu bsdtar wget curl bzip2 g++ build-essential python git ca-certificates iproute2" +ENV BUILD_DEPS="gnupg gosu libarchive-tools wget curl bzip2 g++ build-essential python git ca-certificates iproute2" ENV DEBIAN_FRONTEND=noninteractive ENV \ From b0901ccd01aaa2cf21ebccd56d830f59e9876a40 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Fri, 11 Jun 2021 11:15:53 +0200 Subject: [PATCH 17/81] Development uses now the same Mongo Version (4.4) --- .devcontainer/docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 9a21bbfd6..737ed9624 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -3,10 +3,10 @@ version: '3.7' services: wekandb-dev: - image: mongo:4.0.12 + image: mongo:4.4 container_name: wekan-dev-db restart: unless-stopped - command: mongod --smallfiles --oplogSize 128 + command: mongod --oplogSize 128 networks: - wekan-dev-tier expose: From 403b416b2a7bbfc6997f818ce0f7b36249c38ed5 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Fri, 11 Jun 2021 11:16:23 +0200 Subject: [PATCH 18/81] Development volumes now in the same folder - It's easier for the development to have the files in the same folder than in an extra volume --- .devcontainer/docker-compose.yml | 4 ++-- .dockerignore | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 737ed9624..d1e91b858 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -12,8 +12,8 @@ services: expose: - 27017 volumes: - - wekan-dev-db:/data/db - - wekan-dev-db-dump:/dump + - ./volumes/wekan-db:/data/db + - ./volumes/wekan-db-dump:/dump - /etc/localtime:/etc/localtime:ro wekan-dev: diff --git a/.dockerignore b/.dockerignore index c6d1be4fd..88a4b6897 100644 --- a/.dockerignore +++ b/.dockerignore @@ -32,4 +32,5 @@ ehthumbs.db .eslintcache .meteor/local .devcontainer/docker-compose.extend.yml +.devcontainer/volumes*/ .git From c042d54714a72813f15fdae1d092217f68217f1d Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 11 Jun 2021 12:59:20 +0300 Subject: [PATCH 19/81] Updated ChangeLog. --- CHANGELOG.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e92ecb31..9c7fc56a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,11 +6,8 @@ This release adds the following new improvements: - [Card Description has now the same color on view and editing](https://github.com/wekan/wekan/pull/3851). Thanks to mfilser. - -and adds the following updates: - -- [Updated Docker Ubuntu base image to newest hirsute](https://github.com/wekan/wekan/commit/2a5147a0c173e8610269a6a0d826dab7c2ca3faf). - Thanks to xet7. +- [Development in docker container](https://github.com/wekan/wekan/pull/3852). + Thanks to mfilser. Thanks to above GitHub users for their contributions and translators for their translations. From be3325ce3545b109d08da2436f5c4ec120af2a5a Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Mon, 7 Jun 2021 17:52:36 +0200 Subject: [PATCH 20/81] CustomFields were not created after adding 1 card --- client/components/lists/listBody.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/client/components/lists/listBody.js b/client/components/lists/listBody.js index 283034703..65eff9ed5 100644 --- a/client/components/lists/listBody.js +++ b/client/components/lists/listBody.js @@ -116,8 +116,6 @@ BlazeComponent.extendComponent({ if (position === 'bottom') { this.scrollToBottom(); } - - formComponent.reset(); } }, From 1e837dec11dc5cb266b83efcff4f462aa02d733d Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 11 Jun 2021 13:08:23 +0300 Subject: [PATCH 21/81] Fix Google SSO to access Wekan has not been working by reverting Wekan v5.31 not-working fixes to OAUTH2_LOGIN_STYLE=redirect Has No Effect. Thanks to unpokitodxfavor and xet7 ! Fixes #3854, opens #3845 --- packages/wekan-oidc/oidc_client.js | 38 ++++++++++-------------------- 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/packages/wekan-oidc/oidc_client.js b/packages/wekan-oidc/oidc_client.js index 6b859f11e..6da9d9f0e 100644 --- a/packages/wekan-oidc/oidc_client.js +++ b/packages/wekan-oidc/oidc_client.js @@ -32,8 +32,6 @@ Oidc.requestCredential = function (options, credentialRequestCompleteCallback) { if (config.loginStyle && config.loginStyle == 'popup') { options.display = 'popup'; - } else if (config.loginStyle && config.loginStyle == 'redirect') { - options.display = 'redirect'; } var loginUrl = config.serverUrl + config.authorizationEndpoint; @@ -52,28 +50,18 @@ Oidc.requestCredential = function (options, credentialRequestCompleteCallback) { //console.log('XXX: loginURL: ' + loginUrl) - if (config.loginStyle && config.loginStyle == 'popup') { - options.popupOptions = options.popupOptions || {}; - var popupOptions = { - width: options.popupOptions.width || 320, - height: options.popupOptions.height || 450 - }; + options.popupOptions = options.popupOptions || {}; + var popupOptions = { + width: options.popupOptions.width || 320, + height: options.popupOptions.height || 450 + }; - OAuth.launchLogin({ - loginService: 'oidc', - loginStyle: loginStyle, - loginUrl: loginUrl, - credentialRequestCompleteCallback: credentialRequestCompleteCallback, - credentialToken: credentialToken, - popupOptions: popupOptions, - }); - } else if (config.loginStyle && config.loginStyle == 'redirect') { - OAuth.launchLogin({ - loginService: 'oidc', - loginStyle: loginStyle, - loginUrl: loginUrl, - credentialRequestCompleteCallback: credentialRequestCompleteCallback, - credentialToken: credentialToken, - }); - } + OAuth.launchLogin({ + loginService: 'oidc', + loginStyle: loginStyle, + loginUrl: loginUrl, + credentialRequestCompleteCallback: credentialRequestCompleteCallback, + credentialToken: credentialToken, + popupOptions: popupOptions, + }); }; From cccb7e4a392026f115cd997c0111f087fbb6aeef Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 11 Jun 2021 13:16:20 +0300 Subject: [PATCH 22/81] Updated ChangeLog. --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c7fc56a2..127dfb401 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,12 @@ This release adds the following new improvements: - [Development in docker container](https://github.com/wekan/wekan/pull/3852). Thanks to mfilser. +and fixes the following bugs: + +- [Fix Google SSO to access Wekan has not been working by reverting Wekan v5.31 not-working fixes + to OAUTH2_LOGIN_STYLE=redirect Has No Effect](https://github.com/wekan/wekan/commit/1e837dec11dc5cb266b83efcff4f462aa02d733d). + Thanks to unpokitodxfavor and xet7. + Thanks to above GitHub users for their contributions and translators for their translations. # v5.33 2021-06-10 Wekan release From ab22fb27cedbc96c1a55937bd97861ae3347ef55 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 11 Jun 2021 13:35:06 +0300 Subject: [PATCH 23/81] Updated ChangeLog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 127dfb401..c543b022d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ and fixes the following bugs: - [Fix Google SSO to access Wekan has not been working by reverting Wekan v5.31 not-working fixes to OAUTH2_LOGIN_STYLE=redirect Has No Effect](https://github.com/wekan/wekan/commit/1e837dec11dc5cb266b83efcff4f462aa02d733d). Thanks to unpokitodxfavor and xet7. +- [CustomFields were not created after adding 1 card](https://github.com/wekan/wekan/pull/3856). + Thanks to mfilser. Thanks to above GitHub users for their contributions and translators for their translations. From 540ce3a6ed804e43673a8fdaa7f7437947cbc0a0 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Mon, 12 Apr 2021 23:34:02 +0200 Subject: [PATCH 24/81] CardDetails sorting number is displayed at card and can be modified (if configured) --- client/components/cards/cardDetails.jade | 19 +++++++++++++++++++ client/components/cards/cardDetails.js | 10 ++++++++++ client/components/sidebar/sidebar.jade | 6 ++++++ client/components/sidebar/sidebar.js | 20 ++++++++++++++++++++ i18n/en.i18n.json | 1 + models/boards.js | 12 ++++++++++++ 6 files changed, 68 insertions(+) diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade index da8bf5120..acde82a54 100644 --- a/client/components/cards/cardDetails.jade +++ b/client/components/cards/cardDetails.jade @@ -203,6 +203,19 @@ template(name="cardDetails") +viewer = getAssignedBy + if currentBoard.allowsCardSortingByNumber + .card-details-item.card-details-sort-order + h3.card-details-item-title + i.fa.fa-sort + | {{_ 'sort'}} + if canModifyCard + +inlinedForm(classNames="js-card-details-sort") + +editCardSortOrderForm + else + a.js-open-inlined-form + +viewer + = sort + //.card-details-items if customFieldsWD hr @@ -540,6 +553,12 @@ template(name="editCardAssignerForm") button.primary.confirm.js-submit-edit-card-assigner-form(type="submit") {{_ 'save'}} a.fa.fa-times-thin.js-close-inlined-form +template(name="editCardSortOrderForm") + input.js-edit-card-sort(type='text' autofocus value=sort dir="auto") + .edit-controls.clearfix + button.primary.confirm.js-submit-edit-card-sort-form(type="submit") {{_ 'save'}} + a.fa.fa-times-thin.js-close-inlined-form + template(name="cardDetailsActionsPopup") ul.pop-over-list li diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index 8345460f0..d7a27ff09 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -361,6 +361,16 @@ BlazeComponent.extendComponent({ this.data().setRequestedBy(''); } }, + 'submit .js-card-details-sort'(event) { + event.preventDefault(); + const sort = parseFloat(this.currentComponent() + .getValue() + .trim()); + if (sort) { + let card = this.data(); + card.move(card.boardId, card.swimlaneId, card.listId, sort); + } + }, 'click .js-go-to-linked-card'() { Utils.goCardId(this.data().linkedId); }, diff --git a/client/components/sidebar/sidebar.jade b/client/components/sidebar/sidebar.jade index f0bd05ac7..dcf33dfac 100644 --- a/client/components/sidebar/sidebar.jade +++ b/client/components/sidebar/sidebar.jade @@ -133,6 +133,12 @@ template(name="boardCardSettingsPopup") span i.fa.fa-user-plus | {{_ 'requested-by'}} + div.check-div + a.flex.js-field-has-card-sorting-by-number(class="{{#if allowsCardSortingByNumber}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsCardSortingByNumber}}is-checked{{/if}}") + span + i.fa.fa-sort + | {{_ 'card-sorting-by-number'}} div.check-div a.flex.js-field-has-labels(class="{{#if allowsLabels}}is-checked{{/if}}") .materialCheckBox(class="{{#if allowsLabels}}is-checked{{/if}}") diff --git a/client/components/sidebar/sidebar.js b/client/components/sidebar/sidebar.js index 5c1026c12..a97016898 100644 --- a/client/components/sidebar/sidebar.js +++ b/client/components/sidebar/sidebar.js @@ -754,6 +754,10 @@ BlazeComponent.extendComponent({ return this.currentBoard.allowsRequestedBy; }, + allowsCardSortingByNumber() { + return this.currentBoard.allowsCardSortingByNumber; + }, + allowsLabels() { return this.currentBoard.allowsLabels; }, @@ -968,6 +972,22 @@ BlazeComponent.extendComponent({ this.currentBoard.allowsRequestedBy, ); }, + 'click .js-field-has-card-sorting-by-number'(evt) { + evt.preventDefault(); + this.currentBoard.allowsCardSortingByNumber = !this.currentBoard + .allowsCardSortingByNumber; + this.currentBoard.setAllowsCardSortingByNumber( + this.currentBoard.allowsCardSortingByNumber, + ); + $(`.js-field-has-card-sorting-by-number ${MCB}`).toggleClass( + CKCLS, + this.currentBoard.allowsCardSortingByNumber, + ); + $('.js-field-has-card-sorting-by-number').toggleClass( + CKCLS, + this.currentBoard.allowsCardSortingByNumber, + ); + }, 'click .js-field-has-labels'(evt) { evt.preventDefault(); this.currentBoard.allowsLabels = !this.currentBoard.allowsLabels; diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index f28d62ad3..ef5d15c8e 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", diff --git a/models/boards.js b/models/boards.js index 9cda643b1..0364dd9f7 100644 --- a/models/boards.js +++ b/models/boards.js @@ -373,6 +373,14 @@ Boards.attachSchema( defaultValue: true, }, + allowsCardSortingByNumber: { + /** + * Does the board allows card sorting by number? + */ + type: Boolean, + defaultValue: true, + }, + allowsAssignedBy: { /** * Does the board allows requested by? @@ -1190,6 +1198,10 @@ Boards.mutations({ return { $set: { allowsRequestedBy } }; }, + setAllowsCardSortingByNumber(allowsCardSortingByNumber) { + return { $set: { allowsCardSortingByNumber } }; + }, + setAllowsAttachments(allowsAttachments) { return { $set: { allowsAttachments } }; }, From 39069b322d1d16d11555939bc352e7999119dc81 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Mon, 12 Apr 2021 23:35:01 +0200 Subject: [PATCH 25/81] CardDetails sorting, only float number input possible --- client/components/cards/cardDetails.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index d7a27ff09..75c5f2f69 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -371,6 +371,13 @@ BlazeComponent.extendComponent({ card.move(card.boardId, card.swimlaneId, card.listId, sort); } }, + 'keypress/paste input.js-edit-card-sort'() { + let keyCode = event.keyCode; + let charCode = String.fromCharCode(keyCode); + let regex = new RegExp('[0-9.]'); + let ret = regex.test(charCode); + return ret; + }, 'click .js-go-to-linked-card'() { Utils.goCardId(this.data().linkedId); }, From 57d35a294df53597fbb533918221cf7edb3d5ed9 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Tue, 13 Apr 2021 18:55:43 +0200 Subject: [PATCH 26/81] CardDetails sorting, only float number input possible (only working in an extra handler) - defining in events() doesn't handle the return value and is ignored, maybe a bug in Blaze / Meteor.? --- client/components/cards/cardDetails.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index 75c5f2f69..1f9dc7773 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -371,13 +371,6 @@ BlazeComponent.extendComponent({ card.move(card.boardId, card.swimlaneId, card.listId, sort); } }, - 'keypress/paste input.js-edit-card-sort'() { - let keyCode = event.keyCode; - let charCode = String.fromCharCode(keyCode); - let regex = new RegExp('[0-9.]'); - let ret = regex.test(charCode); - return ret; - }, 'click .js-go-to-linked-card'() { Utils.goCardId(this.data().linkedId); }, @@ -506,6 +499,18 @@ BlazeComponent.extendComponent({ }, }).register('cardDetails'); +// only allow number input +Template.editCardSortOrderForm.onRendered(function() { + this.$('input').on("keypress paste", function() { + let keyCode = event.keyCode; + let charCode = String.fromCharCode(keyCode); + let regex = new RegExp('[-0-9.]'); + let ret = regex.test(charCode); + // only working here, defining in events() doesn't handle the return value correctly + return ret; + }); +}); + // We extends the normal InlinedForm component to support UnsavedEdits draft // feature. (class extends InlinedForm { From 54640bb125eb5b56f9ca17589e32b8932c4bb2bc Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Tue, 13 Apr 2021 19:49:52 +0200 Subject: [PATCH 27/81] Minicard, show sorting number if board config is enabled --- client/components/cards/minicard.jade | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/components/cards/minicard.jade b/client/components/cards/minicard.jade index 60d240a7c..925afec76 100644 --- a/client/components/cards/minicard.jade +++ b/client/components/cards/minicard.jade @@ -139,3 +139,7 @@ template(name="minicard") span.badge-icon.fa.fa-sitemap span.badge-text.check-list-text {{subtasksFinishedCount}}/{{allSubtasksCount}} //{{subtasksFinishedCount}}/{{subtasksCount}} does not work because when a subtaks is archived, the count goes down + if currentBoard.allowsCardSortingByNumber + .badge + span.badge-icon.fa.fa-sort + span.badge-text {{ sort }} From 0fa3a2729da0c3352f945a9e4e266d3d4e568f50 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 11 Jun 2021 13:55:33 +0300 Subject: [PATCH 28/81] Updated ChangeLog. --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c543b022d..ad3b84eb5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,12 @@ # Upcoming Wekan release -This release adds the following new improvements: +This release adds the following new features: + +- [View and change card sort number](https://github.com/wekan/wekan/pull/3857). + Thanks to mfilser. + +and adds the following new improvements: - [Card Description has now the same color on view and editing](https://github.com/wekan/wekan/pull/3851). Thanks to mfilser. From 762391965e6ae3cd5682d5b164131500e7d92338 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 11 Jun 2021 14:28:25 +0300 Subject: [PATCH 29/81] Try to fix BUG: Database error attempting to change a account. Thanks to bbyszio and xet7 ! Fixes #3855 --- models/users.js | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/models/users.js b/models/users.js index 58cad3bf7..1ad7f1a9c 100644 --- a/models/users.js +++ b/models/users.js @@ -952,18 +952,17 @@ if (Meteor.isServer) { userOrgsArray, userTeamsArray, ) { + check(fullname, String); + check(username, String); + check(initials, String); + check(password, String); + check(isAdmin, String); + check(isActive, String); + check(email, String); + check(importUsernames, Array); + check(userOrgsArray, Array); + check(userTeamsArray, Array); if (Meteor.user() && Meteor.user().isAdmin) { - check(fullname, String); - check(username, String); - check(initials, String); - check(password, String); - check(isAdmin, String); - check(isActive, String); - check(email, String); - check(importUsernames, Array); - check(userOrgsArray, Array); - check(userTeamsArray, Array); - const nUsersWithUsername = Users.find({ username, }).count(); @@ -1003,9 +1002,9 @@ if (Meteor.isServer) { } }, setUsername(username, userId) { + check(username, String); + check(userId, String); if (Meteor.user() && Meteor.user().isAdmin) { - check(username, String); - check(userId, String); const nUsersWithUsername = Users.find({ username, }).count(); @@ -1021,11 +1020,12 @@ if (Meteor.isServer) { } }, setEmail(email, userId) { + check(email, String); + check(username, String); if (Meteor.user() && Meteor.user().isAdmin) { if (Array.isArray(email)) { email = email.shift(); } - check(email, String); const existingUser = Users.findOne( { 'emails.address': email, @@ -1053,31 +1053,31 @@ if (Meteor.isServer) { } }, setUsernameAndEmail(username, email, userId) { + check(username, String); + check(email, String); + check(userId, String); if (Meteor.user() && Meteor.user().isAdmin) { - check(username, String); if (Array.isArray(email)) { email = email.shift(); } - check(email, String); - check(userId, String); Meteor.call('setUsername', username, userId); Meteor.call('setEmail', email, userId); } }, setPassword(newPassword, userId) { + check(userId, String); + check(newPassword, String); if (Meteor.user() && Meteor.user().isAdmin) { - check(userId, String); - check(newPassword, String); if (Meteor.user().isAdmin) { Accounts.setPassword(userId, newPassword); } } }, setEmailVerified(email, verified, userId) { + check(email, String); + check(verified, Boolean); + check(userId, String); if (Meteor.user() && Meteor.user().isAdmin) { - check(email, String); - check(verified, Boolean); - check(userId, String); Users.update(userId, { $set: { emails: [ @@ -1091,9 +1091,9 @@ if (Meteor.isServer) { } }, setInitials(initials, userId) { + check(initials, String); + check(userId, String); if (Meteor.user() && Meteor.user().isAdmin) { - check(initials, String); - check(userId, String); Users.update(userId, { $set: { 'profile.initials': initials, From 8f001916177f150358c7c1347945868cc0c394a6 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 11 Jun 2021 14:30:19 +0300 Subject: [PATCH 30/81] Updated ChangeLog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad3b84eb5..1eed23721 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,8 @@ and fixes the following bugs: Thanks to unpokitodxfavor and xet7. - [CustomFields were not created after adding 1 card](https://github.com/wekan/wekan/pull/3856). Thanks to mfilser. +- [Try to fix BUG: Database error attempting to change a account](https://github.com/wekan/wekan/commit/762391965e6ae3cd5682d5b164131500e7d92338). + Thanks to bbyszio and xet7. Thanks to above GitHub users for their contributions and translators for their translations. From 4f9d3d8be56f32837cab9de0cce523c285cc6f9a Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Mon, 26 Apr 2021 18:48:27 +0200 Subject: [PATCH 31/81] List infinite scroll now always works - before sometimes list scrolling stopped even the spinner was visible and scrolling was at the end of the list --- client/components/lists/listBody.js | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/client/components/lists/listBody.js b/client/components/lists/listBody.js index 65eff9ed5..b34d792a2 100644 --- a/client/components/lists/listBody.js +++ b/client/components/lists/listBody.js @@ -770,16 +770,21 @@ BlazeComponent.extendComponent({ }, spinnerInView() { - const parentViewHeight = this.container.clientHeight; - const bottomViewPosition = this.container.scrollTop + parentViewHeight; - - const threshold = this.spinner.offsetTop; - // spinner deleted if (!this.spinner.offsetTop) { return false; } - return bottomViewPosition > threshold; + const parentViewHeight = this.container.clientHeight; + const bottomViewPosition = this.container.scrollTop + parentViewHeight; + + let spinnerOffsetTop = this.spinner.offsetTop; + + const addCard = $(this.container).find("a.open-minicard-composer").first()[0]; + if (addCard !== undefined) { + spinnerOffsetTop -= addCard.clientHeight; + } + + return bottomViewPosition > spinnerOffsetTop; }, }).register('spinnerList'); From 06a2b087807a49b775c6bd7bd81b251bd3d50b89 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Mon, 7 Jun 2021 22:35:56 +0200 Subject: [PATCH 32/81] Spinner configureable in the source code --- client/components/lists/listBody.jade | 10 ++--- client/components/main/spinner.jade | 5 +++ client/components/main/spinner.js | 17 +++++++ client/components/main/spinner.tpl.jade | 6 --- client/components/main/spinner_bounce.jade | 8 ++++ client/components/main/spinner_bounce.styl | 44 +++++++++++++++++++ client/components/main/spinner_wave.jade | 10 +++++ .../main/{spinner.styl => spinner_wave.styl} | 18 +------- 8 files changed, 89 insertions(+), 29 deletions(-) create mode 100644 client/components/main/spinner.jade create mode 100644 client/components/main/spinner.js delete mode 100644 client/components/main/spinner.tpl.jade create mode 100644 client/components/main/spinner_bounce.jade create mode 100644 client/components/main/spinner_bounce.styl create mode 100644 client/components/main/spinner_wave.jade rename client/components/main/{spinner.styl => spinner_wave.styl} (61%) diff --git a/client/components/lists/listBody.jade b/client/components/lists/listBody.jade index ce671cdef..f3aa47048 100644 --- a/client/components/lists/listBody.jade +++ b/client/components/lists/listBody.jade @@ -23,14 +23,10 @@ template(name="listBody") i.fa.fa-plus template(name="spinnerList") - .sk-spinner.sk-spinner-wave.sk-spinner-list( - class=currentBoard.colorClass + .sk-spinner.sk-spinner-list( + class="{{currentBoard.colorClass}} sk-spinner-{{Spinner.spinnerName}}" id="showMoreResults") - .sk-rect1 - .sk-rect2 - .sk-rect3 - .sk-rect4 - .sk-rect5 + +spinnerRaw template(name="addCardForm") .minicard.minicard-composer.js-composer diff --git a/client/components/main/spinner.jade b/client/components/main/spinner.jade new file mode 100644 index 000000000..1c6a7aad2 --- /dev/null +++ b/client/components/main/spinner.jade @@ -0,0 +1,5 @@ +template(name="spinner") + +Template.dynamic(template=Spinner.getSpinnerTemplate) + +template(name="spinnerRaw") + +Template.dynamic(template=Spinner.getSpinnerTemplateRaw) diff --git a/client/components/main/spinner.js b/client/components/main/spinner.js new file mode 100644 index 000000000..8f9d4358f --- /dev/null +++ b/client/components/main/spinner.js @@ -0,0 +1,17 @@ +function getSpinnerName() { + return 'Bounce' +} + +Spinner = { + getSpinnerTemplate() { + return 'spinner' + getSpinnerName() + }, + + getSpinnerTemplateRaw() { + return 'spinner' + getSpinnerName() + 'Raw'; + }, + + spinnerName: getSpinnerName().toLowerCase(), +} + +Blaze.registerHelper('Spinner', Spinner); diff --git a/client/components/main/spinner.tpl.jade b/client/components/main/spinner.tpl.jade deleted file mode 100644 index 9310a6e5b..000000000 --- a/client/components/main/spinner.tpl.jade +++ /dev/null @@ -1,6 +0,0 @@ -.sk-spinner.sk-spinner-wave(class=currentBoard.colorClass) - .sk-rect1 - .sk-rect2 - .sk-rect3 - .sk-rect4 - .sk-rect5 diff --git a/client/components/main/spinner_bounce.jade b/client/components/main/spinner_bounce.jade new file mode 100644 index 000000000..83bc4509c --- /dev/null +++ b/client/components/main/spinner_bounce.jade @@ -0,0 +1,8 @@ +template(name="spinnerBounce") + .sk-spinner.sk-spinner-bounce(class=currentBoard.colorClass) + +spinnerBounceRaw + +template(name="spinnerBounceRaw") + .sk-bounce1 + .sk-bounce2 + .sk-bounce3 diff --git a/client/components/main/spinner_bounce.styl b/client/components/main/spinner_bounce.styl new file mode 100644 index 000000000..7d9ab0248 --- /dev/null +++ b/client/components/main/spinner_bounce.styl @@ -0,0 +1,44 @@ +@import 'nib' + +// From https://github.com/tobiasahlin/SpinKit +.sk-spinner-bounce { + margin: 100px auto 0; + width: 70px; + text-align: center; + + div { + width: 18px; + height: 18px; + background-color: #333; + + border-radius: 100%; + display: inline-block; + -webkit-animation: sk-bouncedelay 1.4s infinite ease-in-out both; + animation: sk-bouncedelay 1.4s infinite ease-in-out both; + } + + .sk-bounce1 { + -webkit-animation-delay: -0.32s; + animation-delay: -0.32s; + } + + .sk-bounce2 { + -webkit-animation-delay: -0.16s; + animation-delay: -0.16s; + } +} + +@-webkit-keyframes sk-bouncedelay { + 0%, 80%, 100% { -webkit-transform: scale(0) } + 40% { -webkit-transform: scale(1.0) } +} + +@keyframes sk-bouncedelay { + 0%, 80%, 100% { + -webkit-transform: scale(0); + transform: scale(0); + } 40% { + -webkit-transform: scale(1.0); + transform: scale(1.0); + } +} diff --git a/client/components/main/spinner_wave.jade b/client/components/main/spinner_wave.jade new file mode 100644 index 000000000..1528bb42f --- /dev/null +++ b/client/components/main/spinner_wave.jade @@ -0,0 +1,10 @@ +template(name="spinnerWave") + .sk-spinner.sk-spinner-wave(class=currentBoard.colorClass) + +spinnerWaveRaw + +template(name="spinnerWaveRaw") + .sk-rect1 + .sk-rect2 + .sk-rect3 + .sk-rect4 + .sk-rect5 diff --git a/client/components/main/spinner.styl b/client/components/main/spinner_wave.styl similarity index 61% rename from client/components/main/spinner.styl rename to client/components/main/spinner_wave.styl index 65c5fe62e..a82d39496 100644 --- a/client/components/main/spinner.styl +++ b/client/components/main/spinner_wave.styl @@ -1,21 +1,7 @@ @import 'nib' -/* - * From https://github.com/tobiasahlin/SpinKit - * - * Usage: - * - *
    - *
    - *
    - *
    - *
    - *
    - *
    - * - */ - -.sk-spinner { +// From https://github.com/tobiasahlin/SpinKit +.sk-spinner-wave { width: 50px; height: 50px; margin: auto; From 849deae11ea9c597ace4f1b36e93acbf957327dd Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Tue, 8 Jun 2021 19:41:17 +0200 Subject: [PATCH 33/81] Spinners needs   - it's not formatted by Meteor well, \n is missing in the generated Javascript code, so i insert   in the template --- client/components/main/spinner_bounce.jade | 3 +++ client/components/main/spinner_wave.jade | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/client/components/main/spinner_bounce.jade b/client/components/main/spinner_bounce.jade index 83bc4509c..5eda2295a 100644 --- a/client/components/main/spinner_bounce.jade +++ b/client/components/main/spinner_bounce.jade @@ -4,5 +4,8 @@ template(name="spinnerBounce") template(name="spinnerBounceRaw") .sk-bounce1 + |   .sk-bounce2 + |   .sk-bounce3 + |   diff --git a/client/components/main/spinner_wave.jade b/client/components/main/spinner_wave.jade index 1528bb42f..fe5a26b0d 100644 --- a/client/components/main/spinner_wave.jade +++ b/client/components/main/spinner_wave.jade @@ -4,7 +4,12 @@ template(name="spinnerWave") template(name="spinnerWaveRaw") .sk-rect1 + |   .sk-rect2 + |   .sk-rect3 + |   .sk-rect4 + |   .sk-rect5 + |   From 7519abf3fe8735691d44e199301368c4d085c7ae Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Tue, 8 Jun 2021 19:47:14 +0200 Subject: [PATCH 34/81] Spinner now configureable in the Settings --- client/components/lists/listBody.jade | 2 +- client/components/main/spinner.js | 32 +++++++++++++++++---- client/components/settings/settingBody.jade | 11 +++++++ client/components/settings/settingBody.js | 12 ++++++++ models/settings.js | 4 +++ server/publications/settings.js | 1 + 6 files changed, 55 insertions(+), 7 deletions(-) diff --git a/client/components/lists/listBody.jade b/client/components/lists/listBody.jade index f3aa47048..2d332f603 100644 --- a/client/components/lists/listBody.jade +++ b/client/components/lists/listBody.jade @@ -24,7 +24,7 @@ template(name="listBody") template(name="spinnerList") .sk-spinner.sk-spinner-list( - class="{{currentBoard.colorClass}} sk-spinner-{{Spinner.spinnerName}}" + class="{{currentBoard.colorClass}} sk-spinner-{{Spinner.getSpinnerNameLC}}" id="showMoreResults") +spinnerRaw diff --git a/client/components/main/spinner.js b/client/components/main/spinner.js index 8f9d4358f..238e59507 100644 --- a/client/components/main/spinner.js +++ b/client/components/main/spinner.js @@ -1,17 +1,37 @@ -function getSpinnerName() { - return 'Bounce' -} +import Settings from '/models/settings'; Spinner = { getSpinnerTemplate() { - return 'spinner' + getSpinnerName() + return 'spinner' + this.getSpinnerName(); }, getSpinnerTemplateRaw() { - return 'spinner' + getSpinnerName() + 'Raw'; + return 'spinner' + this.getSpinnerName() + 'Raw'; }, - spinnerName: getSpinnerName().toLowerCase(), + currentSetting: new ReactiveVar(), + + currentSettings() { + return this.currentSetting.get(); + }, + + getSpinnerName() { + let ret = 'Bounce'; + if (this.currentSettings()) { + ret = this.currentSettings().spinnerName; + } + return ret; + }, + + getSpinnerNameLC() { + return this.getSpinnerName().toLowerCase(); + }, } Blaze.registerHelper('Spinner', Spinner); + +Meteor.subscribe('setting', { + onReady() { + Spinner.currentSetting.set(Settings.findOne()); + }, +}); diff --git a/client/components/settings/settingBody.jade b/client/components/settings/settingBody.jade index f8cfc3a59..342c239a0 100644 --- a/client/components/settings/settingBody.jade +++ b/client/components/settings/settingBody.jade @@ -173,6 +173,9 @@ template(name='layoutSettings') li.layout-form .title {{_ 'default-authentication-method'}} +selectAuthenticationMethod(authenticationMethod=currentSetting.defaultAuthenticationMethod) + li.layout-form + .title {{_ 'spinner-names'}} + +selectSpinnerName(spinnerName=currentSetting.spinnerName) li.layout-form .title {{_ 'custom-product-name'}} .form-group @@ -222,3 +225,11 @@ template(name='selectAuthenticationMethod') option(value="{{value}}" selected) {{_ value}} else option(value="{{value}}") {{_ value}} + +template(name='selectSpinnerName') + select#spinnerName + each spinner in spinners + if isSelected spinner + option(value="{{spinner}}" selected) {{spinner}} + else + option(value="{{spinner}}") {{spinner}} diff --git a/client/components/settings/settingBody.js b/client/components/settings/settingBody.js index 596b40613..2ed1a1b78 100644 --- a/client/components/settings/settingBody.js +++ b/client/components/settings/settingBody.js @@ -199,6 +199,8 @@ BlazeComponent.extendComponent({ $('input[name=displayAuthenticationMethod]:checked').val() === 'true'; const defaultAuthenticationMethod = $('#defaultAuthenticationMethod').val(); + const spinnerName = $('#spinnerName').val(); + try { Settings.update(Settings.findOne()._id, { $set: { @@ -213,6 +215,7 @@ BlazeComponent.extendComponent({ displayAuthenticationMethod, defaultAuthenticationMethod, automaticLinkedUrlSchemes, + spinnerName, }, }); } catch (e) { @@ -384,3 +387,12 @@ Template.selectAuthenticationMethod.helpers({ return Template.instance().data.authenticationMethod === match; }, }); + +Template.selectSpinnerName.helpers({ + spinners() { + return ['Bounce', 'Wave'] + }, + isSelected(match) { + return Template.instance().data.spinnerName === match; + }, +}); diff --git a/models/settings.js b/models/settings.js index db69644fb..286ef29f9 100644 --- a/models/settings.js +++ b/models/settings.js @@ -46,6 +46,10 @@ Settings.attachSchema( type: String, optional: false, }, + spinnerName: { + type: String, + optional: true, + }, hideLogo: { type: Boolean, optional: true, diff --git a/server/publications/settings.js b/server/publications/settings.js index 829824dba..84234e31b 100644 --- a/server/publications/settings.js +++ b/server/publications/settings.js @@ -23,6 +23,7 @@ Meteor.publish('setting', () => { customHTMLbeforeBodyEnd: 1, displayAuthenticationMethod: 1, defaultAuthenticationMethod: 1, + spinnerName: 1, }, }, ); From 43ac328e8ada567bd0ea0b930065b62e7d6a66d2 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Tue, 8 Jun 2021 21:31:12 +0200 Subject: [PATCH 35/81] Spinner config is now reactive - changed at boards as soon as changed in the settings --- client/components/lists/listBody.jade | 2 +- client/components/lists/listBody.js | 50 ++++++++++++++++----------- client/components/main/spinner.jade | 4 +-- client/components/main/spinner.js | 46 +++++++++++------------- 4 files changed, 52 insertions(+), 50 deletions(-) diff --git a/client/components/lists/listBody.jade b/client/components/lists/listBody.jade index 2d332f603..b286347a9 100644 --- a/client/components/lists/listBody.jade +++ b/client/components/lists/listBody.jade @@ -24,7 +24,7 @@ template(name="listBody") template(name="spinnerList") .sk-spinner.sk-spinner-list( - class="{{currentBoard.colorClass}} sk-spinner-{{Spinner.getSpinnerNameLC}}" + class="{{currentBoard.colorClass}} {{getSkSpinnerName}}" id="showMoreResults") +spinnerRaw diff --git a/client/components/lists/listBody.js b/client/components/lists/listBody.js index b34d792a2..a77c47756 100644 --- a/client/components/lists/listBody.js +++ b/client/components/lists/listBody.js @@ -1,3 +1,5 @@ +import { Spinner } from '/client/components/main/spinner'; + const subManager = new SubsManager(); const InfiniteScrollIter = 10; @@ -696,7 +698,7 @@ BlazeComponent.extendComponent({ }, }).register('searchElementPopup'); -BlazeComponent.extendComponent({ +(class extends Spinner { onCreated() { this.cardlimit = this.parentComponent().cardlimit; @@ -724,7 +726,7 @@ BlazeComponent.extendComponent({ .parentComponent() .data()._id; } - }, + } onRendered() { this.spinner = this.find('.sk-spinner-list'); @@ -739,35 +741,37 @@ BlazeComponent.extendComponent({ ); this.updateList(); - }, + } onDestroyed() { $(this.container).off(`scroll.spinner_${this.swimlaneId}_${this.listId}`); $(window).off(`resize.spinner_${this.swimlaneId}_${this.listId}`); - }, + } + + checkIdleTime() { + return window.requestIdleCallback || + function(handler) { + const startTime = Date.now(); + return setTimeout(function() { + handler({ + didTimeout: false, + timeRemaining() { + return Math.max(0, 50.0 - (Date.now() - startTime)); + }, + }); + }, 1); + }; + } updateList() { // Use fallback when requestIdleCallback is not available on iOS and Safari // https://www.afasterweb.com/2017/11/20/utilizing-idle-moments/ - checkIdleTime = - window.requestIdleCallback || - function(handler) { - const startTime = Date.now(); - return setTimeout(function() { - handler({ - didTimeout: false, - timeRemaining() { - return Math.max(0, 50.0 - (Date.now() - startTime)); - }, - }); - }, 1); - }; if (this.spinnerInView()) { this.cardlimit.set(this.cardlimit.get() + InfiniteScrollIter); - checkIdleTime(() => this.updateList()); + this.checkIdleTime(() => this.updateList()); } - }, + } spinnerInView() { // spinner deleted @@ -786,5 +790,9 @@ BlazeComponent.extendComponent({ } return bottomViewPosition > spinnerOffsetTop; - }, -}).register('spinnerList'); + } + + getSkSpinnerName() { + return "sk-spinner-" + super.getSpinnerName().toLowerCase(); + } +}.register('spinnerList')); diff --git a/client/components/main/spinner.jade b/client/components/main/spinner.jade index 1c6a7aad2..1b4d6dad0 100644 --- a/client/components/main/spinner.jade +++ b/client/components/main/spinner.jade @@ -1,5 +1,5 @@ template(name="spinner") - +Template.dynamic(template=Spinner.getSpinnerTemplate) + +Template.dynamic(template=getSpinnerTemplate) template(name="spinnerRaw") - +Template.dynamic(template=Spinner.getSpinnerTemplateRaw) + +Template.dynamic(template=getSpinnerTemplateRaw) diff --git a/client/components/main/spinner.js b/client/components/main/spinner.js index 238e59507..d93609d02 100644 --- a/client/components/main/spinner.js +++ b/client/components/main/spinner.js @@ -1,37 +1,31 @@ -import Settings from '/models/settings'; - -Spinner = { - getSpinnerTemplate() { - return 'spinner' + this.getSpinnerName(); - }, - - getSpinnerTemplateRaw() { - return 'spinner' + this.getSpinnerName() + 'Raw'; - }, - - currentSetting: new ReactiveVar(), +Meteor.subscribe('setting'); +export class Spinner extends BlazeComponent { currentSettings() { - return this.currentSetting.get(); - }, + return Settings.findOne(); + } getSpinnerName() { let ret = 'Bounce'; - if (this.currentSettings()) { - ret = this.currentSettings().spinnerName; + let settings = this.currentSettings(); + + if (settings && settings.spinnerName) { + ret = settings.spinnerName; } return ret; - }, + } - getSpinnerNameLC() { - return this.getSpinnerName().toLowerCase(); - }, + getSpinnerTemplate() { + return 'spinner' + this.getSpinnerName(); + } } -Blaze.registerHelper('Spinner', Spinner); +(class extends Spinner { +}.register('spinner')); -Meteor.subscribe('setting', { - onReady() { - Spinner.currentSetting.set(Settings.findOne()); - }, -}); +(class extends Spinner { + getSpinnerTemplateRaw() { + let ret = super.getSpinnerTemplate() + 'Raw'; + return ret; + } +}.register('spinnerRaw')); From 1d66058240167e443d1b19d48b4a867b4efc7ca6 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Wed, 9 Jun 2021 19:18:44 +0200 Subject: [PATCH 36/81] Spinner class in own .js library file --- client/components/lists/listBody.js | 2 +- client/components/main/spinner.js | 22 +--------------------- client/lib/spinner.js | 21 +++++++++++++++++++++ 3 files changed, 23 insertions(+), 22 deletions(-) create mode 100644 client/lib/spinner.js diff --git a/client/components/lists/listBody.js b/client/components/lists/listBody.js index a77c47756..6073f3900 100644 --- a/client/components/lists/listBody.js +++ b/client/components/lists/listBody.js @@ -1,4 +1,4 @@ -import { Spinner } from '/client/components/main/spinner'; +import { Spinner } from '/client/lib/spinner'; const subManager = new SubsManager(); const InfiniteScrollIter = 10; diff --git a/client/components/main/spinner.js b/client/components/main/spinner.js index d93609d02..2d7ab35f7 100644 --- a/client/components/main/spinner.js +++ b/client/components/main/spinner.js @@ -1,24 +1,4 @@ -Meteor.subscribe('setting'); - -export class Spinner extends BlazeComponent { - currentSettings() { - return Settings.findOne(); - } - - getSpinnerName() { - let ret = 'Bounce'; - let settings = this.currentSettings(); - - if (settings && settings.spinnerName) { - ret = settings.spinnerName; - } - return ret; - } - - getSpinnerTemplate() { - return 'spinner' + this.getSpinnerName(); - } -} +import { Spinner } from '/client/lib/spinner'; (class extends Spinner { }.register('spinner')); diff --git a/client/lib/spinner.js b/client/lib/spinner.js new file mode 100644 index 000000000..c58325d91 --- /dev/null +++ b/client/lib/spinner.js @@ -0,0 +1,21 @@ +Meteor.subscribe('setting'); + +export class Spinner extends BlazeComponent { + currentSettings() { + return Settings.findOne(); + } + + getSpinnerName() { + let ret = 'Bounce'; + let settings = this.currentSettings(); + + if (settings && settings.spinnerName) { + ret = settings.spinnerName; + } + return ret; + } + + getSpinnerTemplate() { + return 'spinner' + this.getSpinnerName(); + } +} From 38069c6d630a19bb55fbaa3e4813f8142f1e4024 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Tue, 8 Jun 2021 19:43:02 +0200 Subject: [PATCH 37/81] Spinner description insert in translation --- client/components/settings/settingBody.jade | 2 +- i18n/en.i18n.json | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/client/components/settings/settingBody.jade b/client/components/settings/settingBody.jade index 342c239a0..bd69e21ad 100644 --- a/client/components/settings/settingBody.jade +++ b/client/components/settings/settingBody.jade @@ -174,7 +174,7 @@ template(name='layoutSettings') .title {{_ 'default-authentication-method'}} +selectAuthenticationMethod(authenticationMethod=currentSetting.defaultAuthenticationMethod) li.layout-form - .title {{_ 'spinner-names'}} + .title {{_ 'wait-spinner'}} +selectSpinnerName(spinnerName=currentSetting.spinnerName) li.layout-form .title {{_ 'custom-product-name'}} diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index ef5d15c8e..11920de5e 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -1039,5 +1039,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } From ba4153312852db4e91d586fe28c0e5012e9a3f55 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Wed, 9 Jun 2021 19:44:41 +0200 Subject: [PATCH 38/81] Default Spinner can be configured through environment variables --- client/components/settings/settingBody.js | 4 +++- client/lib/spinner.js | 6 ++++++ config/const.js | 4 ++++ server/spinner.js | 3 +++ 4 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 server/spinner.js diff --git a/client/components/settings/settingBody.js b/client/components/settings/settingBody.js index 2ed1a1b78..e55e2db6b 100644 --- a/client/components/settings/settingBody.js +++ b/client/components/settings/settingBody.js @@ -1,3 +1,5 @@ +import { ALLOWED_WAIT_SPINNERS } from '/config/const'; + BlazeComponent.extendComponent({ onCreated() { this.error = new ReactiveVar(''); @@ -390,7 +392,7 @@ Template.selectAuthenticationMethod.helpers({ Template.selectSpinnerName.helpers({ spinners() { - return ['Bounce', 'Wave'] + return ALLOWED_WAIT_SPINNERS; }, isSelected(match) { return Template.instance().data.spinnerName === match; diff --git a/client/lib/spinner.js b/client/lib/spinner.js index c58325d91..b0e0723e8 100644 --- a/client/lib/spinner.js +++ b/client/lib/spinner.js @@ -1,5 +1,7 @@ Meteor.subscribe('setting'); +import { ALLOWED_WAIT_SPINNERS } from '/config/const'; + export class Spinner extends BlazeComponent { currentSettings() { return Settings.findOne(); @@ -7,6 +9,10 @@ export class Spinner extends BlazeComponent { getSpinnerName() { let ret = 'Bounce'; + let defaultWaitSpinner = Meteor.settings.public.DEFAULT_WAIT_SPINNER; + if (defaultWaitSpinner && ALLOWED_WAIT_SPINNERS.includes(defaultWaitSpinner)) { + ret = defaultWaitSpinner; + } let settings = this.currentSettings(); if (settings && settings.spinnerName) { diff --git a/config/const.js b/config/const.js index 0c9c71c7c..7dac4e83e 100644 --- a/config/const.js +++ b/config/const.js @@ -49,3 +49,7 @@ export const TYPE_LINKED_BOARD = 'cardType-linkedBoard'; export const TYPE_LINKED_CARD = 'cardType-linkedCard'; export const TYPE_TEMPLATE_BOARD = 'template-board'; export const TYPE_TEMPLATE_CONTAINER = 'template-container'; +export const ALLOWED_WAIT_SPINNERS = [ + 'Bounce', + 'Wave' +]; diff --git a/server/spinner.js b/server/spinner.js new file mode 100644 index 000000000..316641392 --- /dev/null +++ b/server/spinner.js @@ -0,0 +1,3 @@ +Meteor.startup(() => { + Meteor.settings.public.DEFAULT_WAIT_SPINNER = process.env.DEFAULT_WAIT_SPINNER; +}); From 4b9f8ab2b1dc822c013c25eea2e47119d62d44c5 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Wed, 9 Jun 2021 19:54:49 +0200 Subject: [PATCH 39/81] Adding DEFAULT_WAIT_SPINNER to all environments --- .devcontainer/Dockerfile | 3 ++- Dockerfile | 3 ++- docker-compose.yml | 3 +++ releases/virtualbox/start-wekan.sh | 3 +++ snap-src/bin/config | 6 +++++- start-wekan.bat | 2 ++ start-wekan.sh | 3 +++ torodb-postgresql/docker-compose.yml | 3 +++ 8 files changed, 23 insertions(+), 3 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index f8ea94911..0adccae7a 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -130,7 +130,8 @@ ENV \ SAML_PUBLIC_CERTFILE="" \ SAML_IDENTIFIER_FORMAT="" \ SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE="" \ - SAML_ATTRIBUTES="" + SAML_ATTRIBUTES="" \ + DEFAULT_WAIT_SPINNER="" # Install OS RUN set -o xtrace \ diff --git a/Dockerfile b/Dockerfile index 6ba008bad..75ae107d4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -137,7 +137,8 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build- SAML_IDENTIFIER_FORMAT="" \ SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE="" \ SAML_ATTRIBUTES="" \ - ORACLE_OIM_ENABLED=false + ORACLE_OIM_ENABLED=false \ + DEFAULT_WAIT_SPINNER="" # Copy the app to the image COPY ${SRC_PATH} /home/wekan/app diff --git a/docker-compose.yml b/docker-compose.yml index bfcff6f24..6e2570378 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -618,6 +618,9 @@ services: #- SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE= #- SAML_ATTRIBUTES= #--------------------------------------------------------------------- + # Default wait spinner to use + # - DEFAULT_WAIT_SPINNER=Bounce + #--------------------------------------------------------------------- depends_on: - wekandb diff --git a/releases/virtualbox/start-wekan.sh b/releases/virtualbox/start-wekan.sh index 728358d7f..08d145f5f 100755 --- a/releases/virtualbox/start-wekan.sh +++ b/releases/virtualbox/start-wekan.sh @@ -382,6 +382,9 @@ #export SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE= #export SAML_ATTRIBUTES= #--------------------------------------------------------------------- + # Default wait spinner to use + #export DEFAULT_WAIT_SPINNER=Bounce + #--------------------------------------------------------------------- node main.js & >> ~/repos/wekan.log cd ~/repos diff --git a/snap-src/bin/config b/snap-src/bin/config index 52c46f365..9f0680859 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 MONGO_LOG_DESTINATION MONGO_URL MONGODB_BIND_UNIX_SOCKET MONGO_URL MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM ROOT_URL PORT DISABLE_MONGODB CADDY_ENABLED CADDY_BIND_PORT WITH_API RICHER_CARD_COMMENT_EDITOR CARD_OPENED_WEBHOOK_ENABLED 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 MAX_IMAGE_PIXEL IMAGE_COMPRESS_RATIO BIGEVENTS_PATTERN NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE NOTIFY_DUE_DAYS_BEFORE_AND_AFTER NOTIFY_DUE_AT_HOUR_OF_DAY EMAIL_NOTIFICATION_TIMEOUT CORS CORS_ALLOW_HEADERS CORS_EXPOSE_HEADERS MATOMO_ADDRESS MATOMO_SITE_ID MATOMO_DO_NOT_TRACK MATOMO_WITH_USERNAME BROWSER_POLICY_ENABLED TRUSTED_URL WEBHOOKS_ATTRIBUTES OAUTH2_ENABLED OAUTH2_CA_CERT OAUTH2_LOGIN_STYLE 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_ID_TOKEN_WHITELIST_FIELDS OAUTH2_EMAIL_MAP OAUTH2_REQUEST_PERMISSIONS OAUTH2_ADFS_ENABLED 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_AUTHENTICATION LDAP_USER_AUTHENTICATION_FIELD 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 ATTACHMENTS_STORE_PATH PASSWORD_LOGIN_ENABLED CAS_ENABLED CAS_BASE_URL CAS_LOGIN_URL CAS_VALIDATE_URL SAML_ENABLED SAML_PROVIDER SAML_ENTRYPOINT SAML_ISSUER SAML_CERT SAML_IDPSLO_REDIRECTURL SAML_PRIVATE_KEYFILE SAML_PUBLIC_CERTFILE SAML_IDENTIFIER_FORMAT SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE SAML_ATTRIBUTES ORACLE_OIM_ENABLED RESULTS_PER_PAGE" +keys="DEBUG MONGO_LOG_DESTINATION MONGO_URL MONGODB_BIND_UNIX_SOCKET MONGO_URL MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM ROOT_URL PORT DISABLE_MONGODB CADDY_ENABLED CADDY_BIND_PORT WITH_API RICHER_CARD_COMMENT_EDITOR CARD_OPENED_WEBHOOK_ENABLED 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 MAX_IMAGE_PIXEL IMAGE_COMPRESS_RATIO BIGEVENTS_PATTERN NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE NOTIFY_DUE_DAYS_BEFORE_AND_AFTER NOTIFY_DUE_AT_HOUR_OF_DAY EMAIL_NOTIFICATION_TIMEOUT CORS CORS_ALLOW_HEADERS CORS_EXPOSE_HEADERS MATOMO_ADDRESS MATOMO_SITE_ID MATOMO_DO_NOT_TRACK MATOMO_WITH_USERNAME BROWSER_POLICY_ENABLED TRUSTED_URL WEBHOOKS_ATTRIBUTES OAUTH2_ENABLED OAUTH2_CA_CERT OAUTH2_LOGIN_STYLE 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_ID_TOKEN_WHITELIST_FIELDS OAUTH2_EMAIL_MAP OAUTH2_REQUEST_PERMISSIONS OAUTH2_ADFS_ENABLED 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_AUTHENTICATION LDAP_USER_AUTHENTICATION_FIELD 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 ATTACHMENTS_STORE_PATH PASSWORD_LOGIN_ENABLED CAS_ENABLED CAS_BASE_URL CAS_LOGIN_URL CAS_VALIDATE_URL SAML_ENABLED SAML_PROVIDER SAML_ENTRYPOINT SAML_ISSUER SAML_CERT SAML_IDPSLO_REDIRECTURL SAML_PRIVATE_KEYFILE SAML_PUBLIC_CERTFILE SAML_IDENTIFIER_FORMAT SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE SAML_ATTRIBUTES ORACLE_OIM_ENABLED RESULTS_PER_PAGE DEFAULT_WAIT_SPINNER" # default values DESCRIPTION_DEBUG="Debug OIDC OAuth2 etc. Example: sudo snap set wekan debug='true'" @@ -547,3 +547,7 @@ KEY_SAML_ATTRIBUTES="saml-attributes" DESCRIPTION_RESULTS_PER_PAGE="Number of search results to show per page by default" DEFAULT_RESULTS_PER_PAGE="" KEY_RESULTS_PER_PAGE="results-per-page" + +DESCRIPTION_WAIT_SPINNER="Default wait spinner to use" +DEFAULT_WAIT_SPINNER="Bounce" +KEY_WAIT_SPINNER="wait-spinner" diff --git a/start-wekan.bat b/start-wekan.bat index 5779fd6fc..9399e0cec 100644 --- a/start-wekan.bat +++ b/start-wekan.bat @@ -418,4 +418,6 @@ REM SET SAML_IDENTIFIER_FORMAT= REM SET SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE= REM SET SAML_ATTRIBUTES= +REM SET DEFAULT_WAIT_SPINNER= + node main.js diff --git a/start-wekan.sh b/start-wekan.sh index bbdb4e26c..da1b6fc0a 100755 --- a/start-wekan.sh +++ b/start-wekan.sh @@ -388,6 +388,9 @@ #export SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE= #export SAML_ATTRIBUTES= #--------------------------------------------------------------------- + # Default wait spinner to use + #export DEFAULT_WAIT_SPINNER=Bounce + #--------------------------------------------------------------------- node main.js # & >> ../../wekan.log cd ../.. diff --git a/torodb-postgresql/docker-compose.yml b/torodb-postgresql/docker-compose.yml index d6497ac4d..8bfb11f71 100644 --- a/torodb-postgresql/docker-compose.yml +++ b/torodb-postgresql/docker-compose.yml @@ -559,6 +559,9 @@ services: #- SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE= #- SAML_ATTRIBUTES= #--------------------------------------------------------------------- + # Default wait spinner to use + # - DEFAULT_WAIT_SPINNER=Bounce + #--------------------------------------------------------------------- depends_on: - mongodb From 8aa58c0b11f31af97de7cbd7354792bff6f10a77 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Wed, 9 Jun 2021 20:28:07 +0200 Subject: [PATCH 40/81] Spinner Cube now available Spinner from: https://tobiasahlin.com/spinkit/ --- client/components/main/spinner_cube.jade | 8 ++++ client/components/main/spinner_cube.styl | 52 ++++++++++++++++++++++++ config/const.js | 1 + 3 files changed, 61 insertions(+) create mode 100644 client/components/main/spinner_cube.jade create mode 100644 client/components/main/spinner_cube.styl diff --git a/client/components/main/spinner_cube.jade b/client/components/main/spinner_cube.jade new file mode 100644 index 000000000..696d2f5ad --- /dev/null +++ b/client/components/main/spinner_cube.jade @@ -0,0 +1,8 @@ +template(name="spinnerCube") + .sk-spinner.sk-spinner-cube(class=currentBoard.colorClass) + +spinnerCubeRaw + +template(name="spinnerCubeRaw") + .sk-cube1 + .sk-cube2 + .sk-cube3 diff --git a/client/components/main/spinner_cube.styl b/client/components/main/spinner_cube.styl new file mode 100644 index 000000000..92e6e2a11 --- /dev/null +++ b/client/components/main/spinner_cube.styl @@ -0,0 +1,52 @@ +@import 'nib' + +// From https://github.com/tobiasahlin/SpinKit +.sk-spinner-cube { + margin: 100px auto; + width: 40px; + height: 40px; + position: relative; +} + +.sk-cube1, .sk-cube2 { + background-color: #333; + width: 15px; + height: 15px; + position: absolute; + top: 0; + left: 0; + + -webkit-animation: sk-cubemove 1.8s infinite ease-in-out; + animation: sk-cubemove 1.8s infinite ease-in-out; +} + +.sk-cube2 { + -webkit-animation-delay: -0.9s; + animation-delay: -0.9s; +} + +@-webkit-keyframes sk-cubemove { + 25% { -webkit-transform: translateX(35px) rotate(-90deg) scale(0.5) } + 50% { -webkit-transform: translateX(35px) translateY(35px) rotate(-180deg) } + 75% { -webkit-transform: translateX(0px) translateY(35px) rotate(-270deg) scale(0.5) } + 100% { -webkit-transform: rotate(-360deg) } +} + +@keyframes sk-cubemove { + 25% { + transform: translateX(35px) rotate(-90deg) scale(0.5); + -webkit-transform: translateX(35px) rotate(-90deg) scale(0.5); + } 50% { + transform: translateX(35px) translateY(35px) rotate(-179deg); + -webkit-transform: translateX(35px) translateY(35px) rotate(-179deg); + } 50.1% { + transform: translateX(35px) translateY(35px) rotate(-180deg); + -webkit-transform: translateX(35px) translateY(35px) rotate(-180deg); + } 75% { + transform: translateX(0px) translateY(35px) rotate(-270deg) scale(0.5); + -webkit-transform: translateX(0px) translateY(35px) rotate(-270deg) scale(0.5); + } 100% { + transform: rotate(-360deg); + -webkit-transform: rotate(-360deg); + } +} diff --git a/config/const.js b/config/const.js index 7dac4e83e..a99b00590 100644 --- a/config/const.js +++ b/config/const.js @@ -51,5 +51,6 @@ export const TYPE_TEMPLATE_BOARD = 'template-board'; export const TYPE_TEMPLATE_CONTAINER = 'template-container'; export const ALLOWED_WAIT_SPINNERS = [ 'Bounce', + 'Cube', 'Wave' ]; From a74fac4cbf63aff7e2cecd97b6fa58cebea4d29f Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Wed, 9 Jun 2021 20:36:55 +0200 Subject: [PATCH 41/81] Spinner Dot now available Spinner from: https://tobiasahlin.com/spinkit/ --- client/components/main/spinner_dot.jade | 7 ++++ client/components/main/spinner_dot.styl | 51 +++++++++++++++++++++++++ config/const.js | 1 + 3 files changed, 59 insertions(+) create mode 100644 client/components/main/spinner_dot.jade create mode 100644 client/components/main/spinner_dot.styl diff --git a/client/components/main/spinner_dot.jade b/client/components/main/spinner_dot.jade new file mode 100644 index 000000000..187511116 --- /dev/null +++ b/client/components/main/spinner_dot.jade @@ -0,0 +1,7 @@ +template(name="spinnerDot") + .sk-spinner.sk-spinner-dot(class=currentBoard.colorClass) + +spinnerDotRaw + +template(name="spinnerDotRaw") + .sk-dot1 + .sk-dot2 diff --git a/client/components/main/spinner_dot.styl b/client/components/main/spinner_dot.styl new file mode 100644 index 000000000..5f2e36da4 --- /dev/null +++ b/client/components/main/spinner_dot.styl @@ -0,0 +1,51 @@ +@import 'nib' + +// From https://github.com/tobiasahlin/SpinKit +.sk-spinner-dot { + margin: 100px auto; + width: 40px; + height: 40px; + position: relative; + text-align: center; + + -webkit-animation: sk-rotate 2.0s infinite linear; + animation: sk-rotate 2.0s infinite linear; +} + +.sk-dot1, .sk-dot2 { + width: 40%; + height: 40%; + display: inline-block; + position: absolute; + top: 0; + background-color: #333; + border-radius: 100%; + + -webkit-animation: sk-bounce 2.0s infinite ease-in-out; + animation: sk-bounce 2.0s infinite ease-in-out; +} + +.sk-dot2 { + top: auto; + bottom: 0; + -webkit-animation-delay: -1.0s; + animation-delay: -1.0s; +} + +@-webkit-keyframes sk-rotate { 100% { -webkit-transform: rotate(360deg) }} +@keyframes sk-rotate { 100% { transform: rotate(360deg); -webkit-transform: rotate(360deg) }} + +@-webkit-keyframes sk-bounce { + 0%, 100% { -webkit-transform: scale(0.0) } + 50% { -webkit-transform: scale(1.0) } +} + +@keyframes sk-bounce { + 0%, 100% { + transform: scale(0.0); + -webkit-transform: scale(0.0); + } 50% { + transform: scale(1.0); + -webkit-transform: scale(1.0); + } +} diff --git a/config/const.js b/config/const.js index a99b00590..d8cc9b81d 100644 --- a/config/const.js +++ b/config/const.js @@ -52,5 +52,6 @@ export const TYPE_TEMPLATE_CONTAINER = 'template-container'; export const ALLOWED_WAIT_SPINNERS = [ 'Bounce', 'Cube', + 'Dot', 'Wave' ]; From 55d0f0bacde6645e98f7e4a4ff2d3003b8754858 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Wed, 9 Jun 2021 20:39:05 +0200 Subject: [PATCH 42/81] Spinner Rotateplane now available Spinner from: https://tobiasahlin.com/spinkit/ --- .../components/main/spinner_rotateplane.jade | 6 +++ .../components/main/spinner_rotateplane.styl | 38 +++++++++++++++++++ config/const.js | 1 + 3 files changed, 45 insertions(+) create mode 100644 client/components/main/spinner_rotateplane.jade create mode 100644 client/components/main/spinner_rotateplane.styl diff --git a/client/components/main/spinner_rotateplane.jade b/client/components/main/spinner_rotateplane.jade new file mode 100644 index 000000000..35afeda81 --- /dev/null +++ b/client/components/main/spinner_rotateplane.jade @@ -0,0 +1,6 @@ +template(name="spinnerRotateplane") + .sk-spinner.sk-spinner-rotateplane(class=currentBoard.colorClass) + +spinnerRotateplaneRaw + +template(name="spinnerRotateplaneRaw") + .sk-rotateplane1 diff --git a/client/components/main/spinner_rotateplane.styl b/client/components/main/spinner_rotateplane.styl new file mode 100644 index 000000000..1f43d37e3 --- /dev/null +++ b/client/components/main/spinner_rotateplane.styl @@ -0,0 +1,38 @@ +@import 'nib' + +// From https://github.com/tobiasahlin/SpinKit +.sk-spinner-rotateplane { + width: 40px; + height: 40px; + text-align: center; + + margin: 100px auto; + -webkit-animation: sk-rotateplane 1.2s infinite ease-in-out; + animation: sk-rotateplane 1.2s infinite ease-in-out; + + div { + background-color: #333; + height: 100%; + width: 100%; + display: inline-block; + } +} + +@-webkit-keyframes sk-rotateplane { + 0% { -webkit-transform: perspective(120px) } + 50% { -webkit-transform: perspective(120px) rotateY(180deg) } + 100% { -webkit-transform: perspective(120px) rotateY(180deg) rotateX(180deg) } +} + +@keyframes sk-rotateplane { + 0% { + transform: perspective(120px) rotateX(0deg) rotateY(0deg); + -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg) + } 50% { + transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); + -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg) + } 100% { + transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); + -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); + } +} diff --git a/config/const.js b/config/const.js index d8cc9b81d..60f5d084d 100644 --- a/config/const.js +++ b/config/const.js @@ -53,5 +53,6 @@ export const ALLOWED_WAIT_SPINNERS = [ 'Bounce', 'Cube', 'Dot', + 'Rotateplane', 'Wave' ]; From 6df7657c8e50530a75cd7bbd1c1cc2897e2d1c5a Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Wed, 9 Jun 2021 20:40:26 +0200 Subject: [PATCH 43/81] Spinner Scaleout now available Spinner from: https://tobiasahlin.com/spinkit/ --- client/components/main/spinner_scaleout.jade | 6 +++ client/components/main/spinner_scaleout.styl | 40 ++++++++++++++++++++ config/const.js | 1 + 3 files changed, 47 insertions(+) create mode 100644 client/components/main/spinner_scaleout.jade create mode 100644 client/components/main/spinner_scaleout.styl diff --git a/client/components/main/spinner_scaleout.jade b/client/components/main/spinner_scaleout.jade new file mode 100644 index 000000000..2cb21d156 --- /dev/null +++ b/client/components/main/spinner_scaleout.jade @@ -0,0 +1,6 @@ +template(name="spinnerScaleout") + .sk-spinner.sk-spinner-scaleout(class=currentBoard.colorClass) + +spinnerScaleoutRaw + +template(name="spinnerScaleoutRaw") + .sk-scaleout1 diff --git a/client/components/main/spinner_scaleout.styl b/client/components/main/spinner_scaleout.styl new file mode 100644 index 000000000..deb73b68e --- /dev/null +++ b/client/components/main/spinner_scaleout.styl @@ -0,0 +1,40 @@ +@import 'nib' + +// From https://github.com/tobiasahlin/SpinKit +.sk-spinner-scaleout { + width: 40px; + height: 40px; + text-align: center; + + margin: 100px auto; + + border-radius: 100%; + -webkit-animation: sk-scaleout 1.0s infinite ease-in-out; + animation: sk-scaleout 1.0s infinite ease-in-out; + + div { + background-color: #333; + height: 100%; + width: 100%; + display: inline-block; + } +} + +@-webkit-keyframes sk-scaleout { + 0% { -webkit-transform: scale(0) } + 100% { + -webkit-transform: scale(1.0); + opacity: 0; + } +} + +@keyframes sk-scaleout { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } 100% { + -webkit-transform: scale(1.0); + transform: scale(1.0); + opacity: 0; + } +} diff --git a/config/const.js b/config/const.js index 60f5d084d..e9818e465 100644 --- a/config/const.js +++ b/config/const.js @@ -54,5 +54,6 @@ export const ALLOWED_WAIT_SPINNERS = [ 'Cube', 'Dot', 'Rotateplane', + 'Scaleout', 'Wave' ]; From 0caff7d5d5763c3a7012d2dbf521b0dee6c22a73 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Wed, 9 Jun 2021 20:41:10 +0200 Subject: [PATCH 44/81] Spinner Cube-Grid now available Spinner from: https://tobiasahlin.com/spinkit/ --- client/components/main/spinner_cube_grid.jade | 14 ++++ client/components/main/spinner_cube_grid.styl | 64 +++++++++++++++++++ client/lib/spinner.js | 2 +- config/const.js | 1 + 4 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 client/components/main/spinner_cube_grid.jade create mode 100644 client/components/main/spinner_cube_grid.styl diff --git a/client/components/main/spinner_cube_grid.jade b/client/components/main/spinner_cube_grid.jade new file mode 100644 index 000000000..55faf11af --- /dev/null +++ b/client/components/main/spinner_cube_grid.jade @@ -0,0 +1,14 @@ +template(name="spinnerCubeGrid") + .sk-spinner.sk-spinner-cube-grid(class=currentBoard.colorClass) + +spinnerCubeGridRaw + +template(name="spinnerCubeGridRaw") + .sk-cube-grid.sk-cube-grid1 + .sk-cube-grid.sk-cube-grid2 + .sk-cube-grid.sk-cube-grid3 + .sk-cube-grid.sk-cube-grid4 + .sk-cube-grid.sk-cube-grid5 + .sk-cube-grid.sk-cube-grid6 + .sk-cube-grid.sk-cube-grid7 + .sk-cube-grid.sk-cube-grid8 + .sk-cube-grid.sk-cube-grid9 diff --git a/client/components/main/spinner_cube_grid.styl b/client/components/main/spinner_cube_grid.styl new file mode 100644 index 000000000..042aa10fe --- /dev/null +++ b/client/components/main/spinner_cube_grid.styl @@ -0,0 +1,64 @@ +@import 'nib' + +// From https://github.com/tobiasahlin/SpinKit +.sk-spinner-cube-grid { + width: 40px; + height: 40px; + margin: 100px auto; +} + +.sk-spinner-cube-grid .sk-cube-grid { + width: 33%; + height: 33%; + background-color: #333; + float: left; + -webkit-animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out; + animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out; +} +.sk-spinner-cube-grid .sk-cube-grid1 { + -webkit-animation-delay: 0.2s; + animation-delay: 0.2s; } +.sk-spinner-cube-grid .sk-cube-grid2 { + -webkit-animation-delay: 0.3s; + animation-delay: 0.3s; } +.sk-spinner-cube-grid .sk-cube-grid3 { + -webkit-animation-delay: 0.4s; + animation-delay: 0.4s; } +.sk-spinner-cube-grid .sk-cube-grid4 { + -webkit-animation-delay: 0.1s; + animation-delay: 0.1s; } +.sk-spinner-cube-grid .sk-cube-grid5 { + -webkit-animation-delay: 0.2s; + animation-delay: 0.2s; } +.sk-spinner-cube-grid .sk-cube-grid6 { + -webkit-animation-delay: 0.3s; + animation-delay: 0.3s; } +.sk-spinner-cube-grid .sk-cube-grid7 { + -webkit-animation-delay: 0s; + animation-delay: 0s; } +.sk-spinner-cube-grid .sk-cube-grid8 { + -webkit-animation-delay: 0.1s; + animation-delay: 0.1s; } +.sk-spinner-cube-grid .sk-cube-grid9 { + -webkit-animation-delay: 0.2s; + animation-delay: 0.2s; } + +@-webkit-keyframes sk-cubeGridScaleDelay { + 0%, 70%, 100% { + -webkit-transform: scale3D(1, 1, 1); + transform: scale3D(1, 1, 1); + } 35% { + -webkit-transform: scale3D(0, 0, 1); + transform: scale3D(0, 0, 1); + } +} + +@keyframes sk-cubeGridScaleDelay { + 0%, 70%, 100% { + -webkit-transform: scale3D(1, 1, 1); + transform: scale3D(1, 1, 1); + } 35% { + -webkit-transform: scale3D(0, 0, 1); + transform: scale3D(0, 0, 1); + } +} diff --git a/client/lib/spinner.js b/client/lib/spinner.js index b0e0723e8..7b52b7c34 100644 --- a/client/lib/spinner.js +++ b/client/lib/spinner.js @@ -22,6 +22,6 @@ export class Spinner extends BlazeComponent { } getSpinnerTemplate() { - return 'spinner' + this.getSpinnerName(); + return 'spinner' + this.getSpinnerName().replace(/-/, ''); } } diff --git a/config/const.js b/config/const.js index e9818e465..4271bd5ef 100644 --- a/config/const.js +++ b/config/const.js @@ -52,6 +52,7 @@ export const TYPE_TEMPLATE_CONTAINER = 'template-container'; export const ALLOWED_WAIT_SPINNERS = [ 'Bounce', 'Cube', + 'Cube-Grid', 'Dot', 'Rotateplane', 'Scaleout', From d485154a1236594b6b5c734c6b0d222887d4304d Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Wed, 9 Jun 2021 20:50:58 +0200 Subject: [PATCH 45/81] Spinner Double-Bounce now available Spinner from: https://tobiasahlin.com/spinkit/ --- .../main/spinner_double_bounce.jade | 7 +++ .../main/spinner_double_bounce.styl | 44 +++++++++++++++++++ config/const.js | 1 + 3 files changed, 52 insertions(+) create mode 100644 client/components/main/spinner_double_bounce.jade create mode 100644 client/components/main/spinner_double_bounce.styl diff --git a/client/components/main/spinner_double_bounce.jade b/client/components/main/spinner_double_bounce.jade new file mode 100644 index 000000000..206a468d2 --- /dev/null +++ b/client/components/main/spinner_double_bounce.jade @@ -0,0 +1,7 @@ +template(name="spinnerDoubleBounce") + .sk-spinner.sk-spinner-double-bounce(class=currentBoard.colorClass) + +spinnerDoubleBounceRaw + +template(name="spinnerDoubleBounceRaw") + .sk-double-bounce1 + .sk-double-bounce2 diff --git a/client/components/main/spinner_double_bounce.styl b/client/components/main/spinner_double_bounce.styl new file mode 100644 index 000000000..2ef000361 --- /dev/null +++ b/client/components/main/spinner_double_bounce.styl @@ -0,0 +1,44 @@ +@import 'nib' + +// From https://github.com/tobiasahlin/SpinKit +.sk-spinner-double-bounce { + width: 40px; + height: 40px; + + position: relative; + margin: 100px auto; +} + +.sk-double-bounce1, .sk-double-bounce2 { + width: 100%; + height: 100%; + border-radius: 50%; + background-color: #333; + opacity: 0.6; + position: absolute; + top: 0; + left: 0; + + -webkit-animation: sk-bounce 2.0s infinite ease-in-out; + animation: sk-bounce 2.0s infinite ease-in-out; +} + +.sk-double-bounce2 { + -webkit-animation-delay: -1.0s; + animation-delay: -1.0s; +} + +@-webkit-keyframes sk-bounce { + 0%, 100% { -webkit-transform: scale(0.0) } + 50% { -webkit-transform: scale(1.0) } +} + +@keyframes sk-bounce { + 0%, 100% { + transform: scale(0.0); + -webkit-transform: scale(0.0); + } 50% { + transform: scale(1.0); + -webkit-transform: scale(1.0); + } +} diff --git a/config/const.js b/config/const.js index 4271bd5ef..a275ffa6b 100644 --- a/config/const.js +++ b/config/const.js @@ -54,6 +54,7 @@ export const ALLOWED_WAIT_SPINNERS = [ 'Cube', 'Cube-Grid', 'Dot', + 'Double-Bounce', 'Rotateplane', 'Scaleout', 'Wave' From eda3ed59dff16e930c259e24b80f8166036855e2 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 11 Jun 2021 14:48:09 +0300 Subject: [PATCH 46/81] Updated ChangeLog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1eed23721..a18ab8c79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ This release adds the following new features: - [View and change card sort number](https://github.com/wekan/wekan/pull/3857). Thanks to mfilser. +- [More spinners + configureable in admin panel](https://github.com/wekan/wekan/pull/3858). + Thanks to mfilser. and adds the following new improvements: From 8a21b69fb0851e472e4a507e43de14780f84ec0d Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 11 Jun 2021 14:52:31 +0300 Subject: [PATCH 47/81] Updated translations. --- i18n/ar-EG.i18n.json | 4 +++- i18n/ar.i18n.json | 4 +++- i18n/bg.i18n.json | 4 +++- i18n/br.i18n.json | 4 +++- i18n/ca.i18n.json | 4 +++- i18n/cs.i18n.json | 4 +++- i18n/da.i18n.json | 4 +++- i18n/de-CH.i18n.json | 4 +++- i18n/de.i18n.json | 4 +++- i18n/el.i18n.json | 4 +++- i18n/en-GB.i18n.json | 4 +++- i18n/eo.i18n.json | 4 +++- i18n/es-AR.i18n.json | 4 +++- i18n/es-CL.i18n.json | 4 +++- i18n/es-LA.i18n.json | 4 +++- i18n/es-MX.i18n.json | 4 +++- i18n/es-PE.i18n.json | 4 +++- i18n/es-PY.i18n.json | 4 +++- i18n/es.i18n.json | 4 +++- i18n/eu.i18n.json | 4 +++- i18n/fa-IR.i18n.json | 4 +++- i18n/fa.i18n.json | 4 +++- i18n/fi.i18n.json | 4 +++- i18n/fr.i18n.json | 4 +++- i18n/gl.i18n.json | 4 +++- i18n/he.i18n.json | 4 +++- i18n/hi.i18n.json | 4 +++- i18n/hr.i18n.json | 4 +++- i18n/hu.i18n.json | 4 +++- i18n/hy.i18n.json | 4 +++- i18n/id.i18n.json | 4 +++- i18n/ig.i18n.json | 4 +++- i18n/it.i18n.json | 4 +++- i18n/ja.i18n.json | 4 +++- i18n/ka.i18n.json | 4 +++- i18n/km.i18n.json | 4 +++- i18n/ko.i18n.json | 4 +++- i18n/lt.i18n.json | 4 +++- i18n/lv.i18n.json | 4 +++- i18n/mk.i18n.json | 4 +++- i18n/mn.i18n.json | 4 +++- i18n/nb.i18n.json | 4 +++- i18n/nl.i18n.json | 8 +++++--- i18n/oc.i18n.json | 4 +++- i18n/pa.i18n.json | 4 +++- i18n/pl.i18n.json | 4 +++- i18n/pt-BR.i18n.json | 4 +++- i18n/pt.i18n.json | 4 +++- i18n/ro.i18n.json | 4 +++- i18n/ru.i18n.json | 44 +++++++++++++++++++++++--------------------- i18n/sk.i18n.json | 4 +++- i18n/sl.i18n.json | 4 +++- i18n/sr.i18n.json | 4 +++- i18n/sv.i18n.json | 4 +++- i18n/sw.i18n.json | 4 +++- i18n/ta.i18n.json | 4 +++- i18n/th.i18n.json | 4 +++- i18n/tr.i18n.json | 4 +++- i18n/uk.i18n.json | 4 +++- i18n/vi.i18n.json | 4 +++- i18n/zh-CN.i18n.json | 4 +++- i18n/zh-HK.i18n.json | 4 +++- i18n/zh-TW.i18n.json | 4 +++- 63 files changed, 211 insertions(+), 85 deletions(-) diff --git a/i18n/ar-EG.i18n.json b/i18n/ar-EG.i18n.json index 5f2e4e0e5..16f0f2bc8 100644 --- a/i18n/ar-EG.i18n.json +++ b/i18n/ar-EG.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/ar.i18n.json b/i18n/ar.i18n.json index 61dac78ae..c7e6db947 100644 --- a/i18n/ar.i18n.json +++ b/i18n/ar.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "اختر لوناً", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/bg.i18n.json b/i18n/bg.i18n.json index 5e9183aba..97e9fbb56 100644 --- a/i18n/bg.i18n.json +++ b/i18n/bg.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Избери цвят", "assigned-by": "Разпределена от", "requested-by": "Поискан от", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "Изтриването е перманентно. Ще загубите всички списъци, карти и действия асоциирани с тази дъска.", "delete-board-confirm-popup": "Всички списъци, карти, имена и действия ще бъдат изтрити и няма да можете да възстановите съдържанието на дъската. Няма връщане назад.", "boardDeletePopup-title": "Изтриване на Таблото?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/br.i18n.json b/i18n/br.i18n.json index b7488c9e0..c06cd3226 100644 --- a/i18n/br.i18n.json +++ b/i18n/br.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/ca.i18n.json b/i18n/ca.i18n.json index ef21296ad..ac10c2bfb 100644 --- a/i18n/ca.i18n.json +++ b/i18n/ca.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assignat Per", "requested-by": "Demanat Per", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/cs.i18n.json b/i18n/cs.i18n.json index 87c2f4838..e8e04fabc 100644 --- a/i18n/cs.i18n.json +++ b/i18n/cs.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Vyber barvu", "assigned-by": "Přidělil(a)", "requested-by": "Vyžádal(a)", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "Smazání je trvalé. Přijdete o všechny sloupce, karty a akce spojené s tímto tablem.", "delete-board-confirm-popup": "Všechny sloupce, štítky a aktivity budou smazány a obsah tabla nebude možné obnovit. Toto nelze vrátit zpět.", "boardDeletePopup-title": "Smazat tablo?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Report pravidel", "copy-swimlane": "Kopírovat dráhu", "copySwimlanePopup-title": "Kopírovat dráhu", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/da.i18n.json b/i18n/da.i18n.json index 1b429c4ca..048120c9c 100644 --- a/i18n/da.i18n.json +++ b/i18n/da.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Vælg en farve", "assigned-by": "Tildelt af", "requested-by": "Anmodet af", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "Sletning er permanent. Du vil miste alle lister, kort og handlinger knyttet til denne tavle.", "delete-board-confirm-popup": "Alle lister, kort, etiketter og aktiviteter vil blive slettet og du får ikke mulighed for at genskabe tavlens indhold. Dette kan ikke fortrydes.", "boardDeletePopup-title": "Slet tavle?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/de-CH.i18n.json b/i18n/de-CH.i18n.json index dc4e9578c..286bf59d0 100644 --- a/i18n/de-CH.i18n.json +++ b/i18n/de-CH.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Farbe wählen", "assigned-by": "Zugewiesen von", "requested-by": "Angefordert von", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "Löschen kann nicht rückgängig gemacht werden. Sie werden alle Listen, Karten und Aktionen, die mit diesem Board verbunden sind, verlieren.", "delete-board-confirm-popup": "Alle Listen, Karten, Labels und Akivitäten werden gelöscht und Sie können die Inhalte des Boards nicht wiederherstellen! Die Aktion kann nicht rückgängig gemacht werden.", "boardDeletePopup-title": "Board löschen?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Regeln-Bericht", "copy-swimlane": "Swimlane kopieren", "copySwimlanePopup-title": "Swimlane kopieren", - "display-card-creator": "Zeige Karten-Erstellung" + "display-card-creator": "Zeige Karten-Erstellung", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json index 7b0c3c325..9a2e3aefc 100644 --- a/i18n/de.i18n.json +++ b/i18n/de.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Farbe wählen", "assigned-by": "Zugewiesen von", "requested-by": "Angefordert von", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "Löschen kann nicht rückgängig gemacht werden. Sie werden alle Listen, Karten und Aktionen, die mit diesem Board verbunden sind, verlieren.", "delete-board-confirm-popup": "Alle Listen, Karten, Labels und Akivitäten werden gelöscht und Sie können die Inhalte des Boards nicht wiederherstellen! Die Aktion kann nicht rückgängig gemacht werden.", "boardDeletePopup-title": "Board löschen?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Regeln-Bericht", "copy-swimlane": "Kopiere Swimlane", "copySwimlanePopup-title": "Swimlane kopieren", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/el.i18n.json b/i18n/el.i18n.json index dea22da2c..1ac5100f7 100644 --- a/i18n/el.i18n.json +++ b/i18n/el.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Επιλέξτε ένα χρώμα", "assigned-by": "Ανατέθηκε Από", "requested-by": "Αιτήθηκε Από", + "card-sorting-by-number": "Card sorting by number", "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": "Διαγραφή Πίνακα;", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/en-GB.i18n.json b/i18n/en-GB.i18n.json index e4ef111eb..406d2495f 100644 --- a/i18n/en-GB.i18n.json +++ b/i18n/en-GB.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/eo.i18n.json b/i18n/eo.i18n.json index 1afcd1945..26caabb75 100644 --- a/i18n/eo.i18n.json +++ b/i18n/eo.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/es-AR.i18n.json b/i18n/es-AR.i18n.json index 054899f01..58646c4b4 100644 --- a/i18n/es-AR.i18n.json +++ b/i18n/es-AR.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/es-CL.i18n.json b/i18n/es-CL.i18n.json index a6fb5ce50..44243a62d 100644 --- a/i18n/es-CL.i18n.json +++ b/i18n/es-CL.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Elegir un color", "assigned-by": "Asignado por", "requested-by": "Solicitado por", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "Se eliminarán todas las listas, tarjetas y acciones asociadas a este tablero. Esta acción no puede deshacerse.", "delete-board-confirm-popup": "Se eliminarán todas las listas, tarjetas, etiquetas y actividades, y no podrás recuperar los contenidos del tablero. Esta acción no puede deshacerse.", "boardDeletePopup-title": "¿Eliminar el tablero?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/es-LA.i18n.json b/i18n/es-LA.i18n.json index 5f2e4e0e5..16f0f2bc8 100644 --- a/i18n/es-LA.i18n.json +++ b/i18n/es-LA.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/es-MX.i18n.json b/i18n/es-MX.i18n.json index 527e6a01b..968de3ee3 100644 --- a/i18n/es-MX.i18n.json +++ b/i18n/es-MX.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/es-PE.i18n.json b/i18n/es-PE.i18n.json index 9105f160c..44aa20970 100644 --- a/i18n/es-PE.i18n.json +++ b/i18n/es-PE.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Elegir un color", "assigned-by": "Asignado por", "requested-by": "Solicitado por", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "Se eliminarán todas las listas, tarjetas y acciones asociadas a este tablero. Esta acción no puede deshacerse.", "delete-board-confirm-popup": "Se eliminarán todas las listas, tarjetas, etiquetas y actividades, y no podrás recuperar los contenidos del tablero. Esta acción no puede deshacerse.", "boardDeletePopup-title": "¿Eliminar el tablero?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/es-PY.i18n.json b/i18n/es-PY.i18n.json index 5f2e4e0e5..16f0f2bc8 100644 --- a/i18n/es-PY.i18n.json +++ b/i18n/es-PY.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/es.i18n.json b/i18n/es.i18n.json index 44401e722..2616c5073 100644 --- a/i18n/es.i18n.json +++ b/i18n/es.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Elegir un color", "assigned-by": "Asignado por", "requested-by": "Solicitado por", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "Se eliminarán todas las listas, tarjetas y acciones asociadas a este tablero. Esta acción no puede deshacerse.", "delete-board-confirm-popup": "Se eliminarán todas las listas, tarjetas, etiquetas y actividades, y no podrás recuperar los contenidos del tablero. Esta acción no puede deshacerse.", "boardDeletePopup-title": "¿Eliminar el tablero?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/eu.i18n.json b/i18n/eu.i18n.json index 48bdbf589..84eb75af0 100644 --- a/i18n/eu.i18n.json +++ b/i18n/eu.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/fa-IR.i18n.json b/i18n/fa-IR.i18n.json index 219e7132a..e342cd226 100644 --- a/i18n/fa-IR.i18n.json +++ b/i18n/fa-IR.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/fa.i18n.json b/i18n/fa.i18n.json index ba265e601..f8cdd37ae 100644 --- a/i18n/fa.i18n.json +++ b/i18n/fa.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "انتخاب کردن رنگ", "assigned-by": "محول شده توسط", "requested-by": "تقاضا شده توسط", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "حذف دائمی است شما تمام لیست ها، کارت ها و اقدامات مرتبط با این برد را از دست خواهید داد.", "delete-board-confirm-popup": "تمام لیست ها، کارت ها، لیبل ها و فعالیت ها حذف خواهند شد و شما نمی توانید محتوای برد را بازیابی کنید. هیچ واکنشی وجود ندارد", "boardDeletePopup-title": "حذف برد؟", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "گزارش قوانین", "copy-swimlane": "کپی از مسیر", "copySwimlanePopup-title": "کپی از مسیر", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/fi.i18n.json b/i18n/fi.i18n.json index cf3929db3..bd30e8e6b 100644 --- a/i18n/fi.i18n.json +++ b/i18n/fi.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Valitse väri", "assigned-by": "Tehtävänantaja", "requested-by": "Pyytäjä", + "card-sorting-by-number": "Korttien lajittelu numeroiden mukaan", "board-delete-notice": "Poistaminen on lopullista. Menetät kaikki listat, kortit ja toimet tällä taululla.", "delete-board-confirm-popup": "Kaikki listat, kortit, nimilaput ja toimet poistetaan ja et pysty palauttamaan taulun sisältöä. Tätä ei voi peruuttaa.", "boardDeletePopup-title": "Poista taulu?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Säännöt raportti", "copy-swimlane": "Kopioi Swimlane", "copySwimlanePopup-title": "Kopioi Swimlane", - "display-card-creator": "Näytä kortin luoja" + "display-card-creator": "Näytä kortin luoja", + "wait-spinner": "Odotus pyörijä" } \ No newline at end of file diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json index 604b57cdf..6dccb5c3a 100644 --- a/i18n/fr.i18n.json +++ b/i18n/fr.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choisissez une couleur", "assigned-by": "Assigné par", "requested-by": "Demandé par", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "La suppression est définitive. Vous perdrez toutes les listes, cartes et actions associées à ce tableau.", "delete-board-confirm-popup": "Toutes les listes, cartes, étiquettes et activités seront supprimées et vous ne pourrez pas retrouver le contenu du tableau. Il n'y a pas d'annulation possible.", "boardDeletePopup-title": "Supprimer le tableau ?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rapports sur les règles", "copy-swimlane": "Copier le couloir", "copySwimlanePopup-title": "Copie de Couloir", - "display-card-creator": "Afficher le créateur de la carte" + "display-card-creator": "Afficher le créateur de la carte", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/gl.i18n.json b/i18n/gl.i18n.json index 91c421035..37836f451 100644 --- a/i18n/gl.i18n.json +++ b/i18n/gl.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/he.i18n.json b/i18n/he.i18n.json index d055e1030..024564a67 100644 --- a/i18n/he.i18n.json +++ b/i18n/he.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "בחירת צבע", "assigned-by": "הוקצה על ידי", "requested-by": "התבקש על ידי", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "מחיקה היא לצמיתות. כל הרשימות, הכרטיבים והפעולות שקשורים בלוח הזה ילכו לאיבוד.", "delete-board-confirm-popup": "כל הרשימות, הכרטיסים, התווית והפעולות יימחקו ולא תהיה לך דרך לשחזר את תכני הלוח. אין אפשרות לבטל.", "boardDeletePopup-title": "למחוק את הלוח?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "דוח כללים", "copy-swimlane": "העתקת מסלול", "copySwimlanePopup-title": "העתקת מסלול", - "display-card-creator": "להציג את יוצר הכרטיסים" + "display-card-creator": "להציג את יוצר הכרטיסים", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/hi.i18n.json b/i18n/hi.i18n.json index 26d1eac2d..86748a914 100644 --- a/i18n/hi.i18n.json +++ b/i18n/hi.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "Deleting is permanent. You will lose संपूर्ण lists, कार्ड और actions associated साथ में यह बोर्ड.", "delete-board-confirm-popup": "All lists, कार्ड,नामपत्र , और activities हो जाएगा deleted और you won't be able तक recover the बोर्ड contents. There is no undo.", "boardDeletePopup-title": "मिटाएँ बोर्ड?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/hr.i18n.json b/i18n/hr.i18n.json index 2a6ce32b2..6ec7fab0c 100644 --- a/i18n/hr.i18n.json +++ b/i18n/hr.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Zadano od", "requested-by": "Zatraženo od", + "card-sorting-by-number": "Card sorting by number", "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": "Obrisati ploču?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/hu.i18n.json b/i18n/hu.i18n.json index 460fae527..94e274228 100644 --- a/i18n/hu.i18n.json +++ b/i18n/hu.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Válassz színt", "assigned-by": "Hozzárendelte ", "requested-by": "Igényelte", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "A törlés végleges. Minden Lista, Kártya és kapcsolódó esemény megsemmisül ezen a Táblán.", "delete-board-confirm-popup": "Minden Lista, Kártya, Címke és Esemény véglegesen törlésre kerül és nincs rá mód, hogy visszanyerd a Tábla tartalmát. Nincs visszavonási lehetőség sem.", "boardDeletePopup-title": "TÖRLÖD a Táblát?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/hy.i18n.json b/i18n/hy.i18n.json index 8aa7c0ef9..b5b861ff9 100644 --- a/i18n/hy.i18n.json +++ b/i18n/hy.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/id.i18n.json b/i18n/id.i18n.json index 31a71eca5..a398e7e6f 100644 --- a/i18n/id.i18n.json +++ b/i18n/id.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Pilih warna", "assigned-by": "Ditandatangani Oleh", "requested-by": "Diminta Oleh", + "card-sorting-by-number": "Card sorting by number", "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": "Hapus Papan?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/ig.i18n.json b/i18n/ig.i18n.json index 547a5a7f2..0520bd582 100644 --- a/i18n/ig.i18n.json +++ b/i18n/ig.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json index e27e388f0..5e91c95d0 100644 --- a/i18n/it.i18n.json +++ b/i18n/it.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Scegli un colore", "assigned-by": "Assegnato da", "requested-by": "Richiesto da", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "L'eliminazione è permanente. Tutte le azioni, liste e schede associate a questa bacheca andranno perse.", "delete-board-confirm-popup": "Tutte le liste, schede, etichette e azioni saranno rimosse e non sarai più in grado di recuperare il contenuto della bacheca. L'azione non è annullabile.", "boardDeletePopup-title": "Eliminare la bacheca?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/ja.i18n.json b/i18n/ja.i18n.json index cc2e23d93..70b87da7e 100644 --- a/i18n/ja.i18n.json +++ b/i18n/ja.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "色を選択", "assigned-by": "任命者", "requested-by": "依頼者", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "永久に削除されます。このボードに関連するリスト、カード、アクションはすべて失われます。", "delete-board-confirm-popup": "すべてのリスト、カード、ラベル、アクティビティは削除され、ボードの内容を元に戻すことができません。", "boardDeletePopup-title": "ボードを削除しますか?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "ルールレポート", "copy-swimlane": "スイムレーンをコピーする", "copySwimlanePopup-title": "スイムレーンをコピーする", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/ka.i18n.json b/i18n/ka.i18n.json index 55256f824..ffb916fc0 100644 --- a/i18n/ka.i18n.json +++ b/i18n/ka.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "უფლებამოსილების გამცემი ", "requested-by": "მომთხოვნი", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "წაშლის შემთხვევაში თქვენ დაკარგავთ ამ დაფასთან ასოცირებულ ყველა მონაცემს მათ შორის : ჩამონათვალს, ბარათებს და მოქმედებებს. ", "delete-board-confirm-popup": "ყველა ჩამონათვალი, ბარათი, ნიშანი და აქტივობა წაიშლება და თქვენ ვეღარ შეძლებთ მის აღდგენას. ", "boardDeletePopup-title": "წავშალოთ დაფა? ", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/km.i18n.json b/i18n/km.i18n.json index e3c8c7dc8..e35581280 100644 --- a/i18n/km.i18n.json +++ b/i18n/km.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/ko.i18n.json b/i18n/ko.i18n.json index 7ffb6d202..f10032d83 100644 --- a/i18n/ko.i18n.json +++ b/i18n/ko.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "색상 선택", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", "delete-board-confirm-popup": "모든 목록, 카드, 레이블 및 활동이 삭제되고 보드 내용을 복구할 수 없습니다. 실행 취소는 불가능합니다.", "boardDeletePopup-title": "보드 삭제?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/lt.i18n.json b/i18n/lt.i18n.json index 5f2e4e0e5..16f0f2bc8 100644 --- a/i18n/lt.i18n.json +++ b/i18n/lt.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/lv.i18n.json b/i18n/lv.i18n.json index 6281ca026..e522b7190 100644 --- a/i18n/lv.i18n.json +++ b/i18n/lv.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Izvēlieties krāsu", "assigned-by": "Īpašnieks", "requested-by": "Pieprasītājs", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "Dzēšana nav atsaucama. Zaudēsiet visus sarakstus, kartiņas un darbības šajā dēlī.", "delete-board-confirm-popup": "Visi saraksti, kartiņas, birkas un darbības tiks dzēstas un dēli nevarēs atgūt. Darbība nav atsaucama.", "boardDeletePopup-title": "Dzēst dēli?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/mk.i18n.json b/i18n/mk.i18n.json index 3f6f957c8..7f871ce93 100644 --- a/i18n/mk.i18n.json +++ b/i18n/mk.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Разпределена от", "requested-by": "Поискан от", + "card-sorting-by-number": "Card sorting by number", "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": "Изтриване на Таблото?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/mn.i18n.json b/i18n/mn.i18n.json index d078184b5..d07dddc58 100644 --- a/i18n/mn.i18n.json +++ b/i18n/mn.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/nb.i18n.json b/i18n/nb.i18n.json index c27a28fba..ab0d78928 100644 --- a/i18n/nb.i18n.json +++ b/i18n/nb.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Velg en farge", "assigned-by": "Tildelt av", "requested-by": "Forespurt av", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "Sletting er permanent. Du vil miste alle lister, kort og aksjoner assosiert med denne tavlen,", "delete-board-confirm-popup": "Alle lister, kort, etiketter og aktiviteter vil bli slettet og du vil ikke kunne gjenopprette innholdet på tavlen. Det er ikke mulig å angre.", "boardDeletePopup-title": "Slett Tavle?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rapportering Regler", "copy-swimlane": "Kopiér Svømmebane", "copySwimlanePopup-title": "Kopiér Svømmebane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/nl.i18n.json b/i18n/nl.i18n.json index aca15cd31..3238168c2 100644 --- a/i18n/nl.i18n.json +++ b/i18n/nl.i18n.json @@ -82,8 +82,8 @@ "add-attachment": "Bijlage Toevoegen", "add-board": "Bord Toevoegen", "add-card": "Kaart Toevoegen", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-card-to-top-of-list": "Voeg Kaart Boven Aan de Lijst Toe", + "add-card-to-bottom-of-list": "Voeg Kaart Onder Aan de Lijst Toe", "add-swimlane": "Swimlane Toevoegen", "add-subtask": "Subtaak Toevoegen", "add-checklist": "Checklist toevoegen", @@ -664,6 +664,7 @@ "setListColorPopup-title": "Kies een kleur", "assigned-by": "Toegewezen door", "requested-by": "Aangevraagd door", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "Verwijdering kan niet ongedaan gemaakt worden. Je raakt alle met dit bord gerelateerde lijsten, kaarten en acties kwijt.", "delete-board-confirm-popup": "Alle lijsten, kaarten, labels en activiteiten zullen worden verwijderd en je kunt de bordinhoud niet terughalen. Er is geen herstelmogelijkheid. ", "boardDeletePopup-title": "Bord verwijderen?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Regels Rapportage", "copy-swimlane": "Kopieer Swimlane", "copySwimlanePopup-title": "Kopieer Swimlane", - "display-card-creator": "Toon Aanmaker Kaart" + "display-card-creator": "Toon Aanmaker Kaart", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/oc.i18n.json b/i18n/oc.i18n.json index 03ae1f12d..82e1d2cf7 100644 --- a/i18n/oc.i18n.json +++ b/i18n/oc.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Causir una color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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": "Suprimir lo tablèu ?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/pa.i18n.json b/i18n/pa.i18n.json index 5f2e4e0e5..16f0f2bc8 100644 --- a/i18n/pa.i18n.json +++ b/i18n/pa.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/pl.i18n.json b/i18n/pl.i18n.json index 0b9425c7f..fd710d734 100644 --- a/i18n/pl.i18n.json +++ b/i18n/pl.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Wybierz barwę", "assigned-by": "Przypisane przez", "requested-by": "Zlecone przez", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "Usunięcie jest nieodwracalne. Stracisz wszystkie listy, karty oraz reguły przypisane do tej tablicy.", "delete-board-confirm-popup": "Wszystkie listy, etykiety oraz aktywności zostaną usunięte i nie będziesz w stanie przywrócić zawartości tablicy. Tego nie da się cofnąć.", "boardDeletePopup-title": "Usunąć tablicę?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Wykaz reguł", "copy-swimlane": "Skopiuj ścieżkę", "copySwimlanePopup-title": "Kopiowanie ścieżki", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/pt-BR.i18n.json b/i18n/pt-BR.i18n.json index b1cf49060..a5437d51e 100644 --- a/i18n/pt-BR.i18n.json +++ b/i18n/pt-BR.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Escolha uma cor", "assigned-by": "Atribuído por", "requested-by": "Solicitado por", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "Excluir é permanente. Você perderá todas as listas, cartões e ações associados nesse quadro.", "delete-board-confirm-popup": "Todas as listas, cartões, etiquetas e atividades serão excluídas e você não poderá recuperar o conteúdo do quadro. Não há como desfazer.", "boardDeletePopup-title": "Excluir quadro?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Regras de Relatório", "copy-swimlane": "Copiar Raia", "copySwimlanePopup-title": "Copiar Raia", - "display-card-creator": "Exibir Criador do Cartão" + "display-card-creator": "Exibir Criador do Cartão", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/pt.i18n.json b/i18n/pt.i18n.json index 6757c30af..7092d02d2 100644 --- a/i18n/pt.i18n.json +++ b/i18n/pt.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Escolha uma cor", "assigned-by": "Atribuído Por", "requested-by": "Solicitado Por", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "Apagar é permanente. Irá perder todas as listas, cartões e acções associadas a este quadro.", "delete-board-confirm-popup": "Todas as listas, cartões, etiquetas e atividades serão apagadas e não poderá recuperar o conteúdo do quadro. Não é reversível.", "boardDeletePopup-title": "Apagar Quadro?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Relatório de Regras", "copy-swimlane": "Copiar Pista", "copySwimlanePopup-title": "Copiar Pista", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/ro.i18n.json b/i18n/ro.i18n.json index 325b67733..f6d7f9338 100644 --- a/i18n/ro.i18n.json +++ b/i18n/ro.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/ru.i18n.json b/i18n/ru.i18n.json index 2ae26a30a..5fee8a9f4 100644 --- a/i18n/ru.i18n.json +++ b/i18n/ru.i18n.json @@ -82,8 +82,8 @@ "add-attachment": "Добавить вложение", "add-board": "Добавить доску", "add-card": "Добавить карточку", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-card-to-top-of-list": "Добавить карточку в начало списка", + "add-card-to-bottom-of-list": "Добавить карточку в конец списка", "add-swimlane": "Добавить дорожку", "add-subtask": "Добавить подзадачу", "add-checklist": "Добавить контрольный список", @@ -133,7 +133,7 @@ "board-not-found": "Доска не найдена", "board-private-info": "Это доска будет частной.", "board-public-info": "Эта доска будет доступной всем.", - "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "board-drag-drop-reorder-or-click-open": "Перетаскивайте, чтобы упорядочить значки доски. Нажмите значок доски чтобы открыть доску.", "boardChangeColorPopup-title": "Изменить фон доски", "boardChangeTitlePopup-title": "Переименовать доску", "boardChangeVisibilityPopup-title": "Изменить настройки видимости", @@ -181,10 +181,10 @@ "vote-against": "против", "deleteVotePopup-title": "Удалить голосование?", "vote-delete-pop": "Это действие невозможно будет отменить. Все связанные с голосованием действия будут потеряны.", - "cardStartPlanningPokerPopup-title": "Start a Planning Poker", - "card-edit-planning-poker": "Edit Planning Poker", - "editPokerEndDatePopup-title": "Change Planning Poker vote end date", - "poker-question": "Planning Poker", + "cardStartPlanningPokerPopup-title": "Начать покер планирования", + "card-edit-planning-poker": "Редактировать покер планирования.", + "editPokerEndDatePopup-title": "Изменить дату окончания голосования покера планирования.", + "poker-question": "Покер планирования", "poker-one": "1", "poker-two": "2", "poker-three": "3", @@ -195,13 +195,13 @@ "poker-forty": "40", "poker-oneHundred": "100", "poker-unsure": "?", - "poker-finish": "Finish", - "poker-result-votes": "Votes", - "poker-result-who": "Who", - "poker-replay": "Replay", - "set-estimation": "Set Estimation", - "deletePokerPopup-title": "Delete planning poker?", - "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "poker-finish": "Закончить", + "poker-result-votes": "Голоса", + "poker-result-who": "Кто", + "poker-replay": "Переиграть", + "set-estimation": "Задать оценку", + "deletePokerPopup-title": "Удалить покер планирования?", + "poker-delete-pop": "Удаление необратимо. Вы потеряете действия ассоциированные с этим покером планирования.", "cardDeletePopup-title": "Удалить карточку?", "cardDetailsActionsPopup-title": "Действия в карточке", "cardLabelsPopup-title": "Метки", @@ -233,7 +233,7 @@ "close": "Закрыть", "close-board": "Закрыть доску", "close-board-pop": "Вы сможете восстановить доску, нажав \"Архив\" в заголовке домашней страницы.", - "close-card": "Close Card", + "close-card": "Закрыть карточку", "color-black": "черный", "color-blue": "синий", "color-crimson": "малиновый", @@ -447,8 +447,8 @@ "set-color-list": "Задать цвет", "listActionPopup-title": "Список действий", "settingsUserPopup-title": "Пользовательские настройки", - "settingsTeamPopup-title": "Team Settings", - "settingsOrgPopup-title": "Organization Settings", + "settingsTeamPopup-title": "Настройки команды", + "settingsOrgPopup-title": "Настройки организации", "swimlaneActionPopup-title": "Действия с дорожкой", "swimlaneAddPopup-title": "Добавить дорожку ниже", "listImportCardPopup-title": "Импортировать Trello карточку", @@ -664,6 +664,7 @@ "setListColorPopup-title": "Выберите цвет", "assigned-by": "Поручил", "requested-by": "Запросил", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "Удаление является постоянным. Вы потеряете все списки, карты и действия, связанные с этой доской.", "delete-board-confirm-popup": "Все списки, карточки, метки и действия будут удалены, и вы не сможете восстановить содержимое доски. Отменить нельзя.", "boardDeletePopup-title": "Удалить доску?", @@ -845,8 +846,8 @@ "act-duenow": "напомнил, что срок выполнения (__timeValue__) карточки __card__ — это уже сейчас", "act-atUserComment": "Вас упомянули в [__board__] __list__/__card__", "delete-user-confirm-popup": "Вы уверены, что хотите удалить аккаунт? Данное действие необратимо.", - "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", - "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "delete-team-confirm-popup": "Вы уверены, что хотите удалить эту команду? Эту операцию нельзя отменить.", + "delete-org-confirm-popup": "Вы уверены, что хотите удалить эту организацию? Эту операцию нельзя отменить.", "accounts-allowUserDelete": "Разрешить пользователям удалять собственные аккаунты", "hide-minicard-label-text": "Скрыть текст меток на карточках", "show-desktop-drag-handles": "Показать ярлыки для перетаскивания", @@ -933,7 +934,7 @@ "operator-user": "пользователь", "operator-user-abbrev": "@", "operator-member": "участника", - "operator-member-abbrev": "m", + "operator-member-abbrev": "м", "operator-assignee": "Кому назначено", "operator-assignee-abbrev": "a", "operator-creator": "автор", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Отчёт по правилам", "copy-swimlane": "Скопировать дорожку", "copySwimlanePopup-title": "Скопировать дорожку", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Показать создателя карты", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/sk.i18n.json b/i18n/sk.i18n.json index 97f89bfd0..f8a1439c5 100644 --- a/i18n/sk.i18n.json +++ b/i18n/sk.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/sl.i18n.json b/i18n/sl.i18n.json index f12b56a3a..7bf8046a3 100644 --- a/i18n/sl.i18n.json +++ b/i18n/sl.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Izberi barvo", "assigned-by": "Dodelil", "requested-by": "Zahteval", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "Brisanje je trajno. Izgubili boste vse sezname, kartice in akcije, povezane z desko.", "delete-board-confirm-popup": "Vsi seznami, kartice, oznake in dejavnosti bodo izbrisani in vsebine table ne boste mogli obnoviti. Razveljavitve ni.", "boardDeletePopup-title": "Izbriši tablo?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/sr.i18n.json b/i18n/sr.i18n.json index 955ac1862..2cdc533bf 100644 --- a/i18n/sr.i18n.json +++ b/i18n/sr.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Izaberi boju", "assigned-by": "Dodeljeno od strane", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/sv.i18n.json b/i18n/sv.i18n.json index 34c02703b..5d6fa2902 100644 --- a/i18n/sv.i18n.json +++ b/i18n/sv.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Välj en färg", "assigned-by": "Tilldelad av", "requested-by": "Efterfrågad av", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "Radering är permanent. Du kommer förlora alla listor, kort och händelser kopplade till den här tavlan.", "delete-board-confirm-popup": "Alla listor, kort, etiketter och aktiviteter kommer tas bort och du kommer inte kunna återställa tavlans innehåll. Det går inte att ångra.", "boardDeletePopup-title": "Ta bort tavla?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Regelrapport", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/sw.i18n.json b/i18n/sw.i18n.json index 80f820d51..eb1fdec48 100644 --- a/i18n/sw.i18n.json +++ b/i18n/sw.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/ta.i18n.json b/i18n/ta.i18n.json index 1167185d4..3b7736752 100644 --- a/i18n/ta.i18n.json +++ b/i18n/ta.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/th.i18n.json b/i18n/th.i18n.json index 9fa38866f..3e51d40e3 100644 --- a/i18n/th.i18n.json +++ b/i18n/th.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/tr.i18n.json b/i18n/tr.i18n.json index f4191351a..6d43d89c0 100644 --- a/i18n/tr.i18n.json +++ b/i18n/tr.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Renk seçimi yap", "assigned-by": "Atamayı yapan", "requested-by": "Talep Eden", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "Silme kalıcıdır. Bu kartla ilişkili tüm listeleri, kartları ve işlemleri kaybedeceksiniz.", "delete-board-confirm-popup": "Tüm listeler, kartlar, etiketler ve etkinlikler silinecek ve pano içeriğini kurtaramayacaksınız. Geri dönüş yok.", "boardDeletePopup-title": "Panoyu Sil?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/uk.i18n.json b/i18n/uk.i18n.json index 3b681ebc2..a09da9c47 100644 --- a/i18n/uk.i18n.json +++ b/i18n/uk.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Оберіть колір", "assigned-by": "Assigned By", "requested-by": "Запитано", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "Це видалення назавжди. Ви втратите всі листи, картки та дії, пов'язані з цією дошкою.", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/vi.i18n.json b/i18n/vi.i18n.json index 860a87174..6f5ee5687 100644 --- a/i18n/vi.i18n.json +++ b/i18n/vi.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Chọn một màu", "assigned-by": "Được chỉ định bởi", "requested-by": "Yêu cầu bởi", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "Việc xóa là vĩnh viễn. Bạn sẽ mất tất cả danh sách, thẻ và hành động liên quan đến bảng này.", "delete-board-confirm-popup": "Tất cả danh sách, thẻ, nhãn và hoạt động sẽ bị xóa và bạn sẽ không thể khôi phục nội dung bảng. Không thể hoàn tác.", "boardDeletePopup-title": "Xoá Bảng?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Quy tắc Báo cáo", "copy-swimlane": "Sao chép Làn ngang", "copySwimlanePopup-title": "Sao chép Làn ngang", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/zh-CN.i18n.json b/i18n/zh-CN.i18n.json index 7826328b0..d9db9155a 100644 --- a/i18n/zh-CN.i18n.json +++ b/i18n/zh-CN.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "选择一种颜色", "assigned-by": "指派人", "requested-by": "需求人", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "删除时永久操作,将会丢失此看板上的所有列表、卡片和动作。", "delete-board-confirm-popup": "所有列表、卡片、标签和活动都回被删除,将无法恢复看板内容。不支持撤销。", "boardDeletePopup-title": "删除看板?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "规则报告", "copy-swimlane": "复制泳道", "copySwimlanePopup-title": "复制泳道", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/zh-HK.i18n.json b/i18n/zh-HK.i18n.json index dba10bb9a..fbe1713f8 100644 --- a/i18n/zh-HK.i18n.json +++ b/i18n/zh-HK.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", "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?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file diff --git a/i18n/zh-TW.i18n.json b/i18n/zh-TW.i18n.json index 1ff87757b..af13522a5 100644 --- a/i18n/zh-TW.i18n.json +++ b/i18n/zh-TW.i18n.json @@ -664,6 +664,7 @@ "setListColorPopup-title": "選擇顏色", "assigned-by": "分配者", "requested-by": "請求者", + "card-sorting-by-number": "Card sorting by number", "board-delete-notice": "永久刪除是無法復原的,你將會失去這個看板上的所有清單、卡片和動作。", "delete-board-confirm-popup": "所有清單、卡片、標籤和活動都會被刪除,將無法恢覆看板內容。不支援撤銷。", "boardDeletePopup-title": "刪除看板?", @@ -1037,5 +1038,6 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator" + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner" } \ No newline at end of file From 488b765f95ad67b19630cd125543836c04eaa24f Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 11 Jun 2021 15:17:43 +0300 Subject: [PATCH 48/81] Added remaining WAIT_SPINNER settings. Thanks to xet7 ! Related https://github.com/wekan/wekan/pull/3858 --- Dockerfile | 2 +- client/lib/spinner.js | 2 +- docker-compose.yml | 4 ++-- releases/virtualbox/start-wekan.sh | 4 ++-- server/spinner.js | 2 +- snap-src/bin/config | 2 +- snap-src/bin/wekan-help | 3 +++ start-wekan.bat | 3 ++- start-wekan.sh | 4 ++-- torodb-postgresql/docker-compose.yml | 4 ++-- 10 files changed, 17 insertions(+), 13 deletions(-) diff --git a/Dockerfile b/Dockerfile index 75ae107d4..57c53e746 100644 --- a/Dockerfile +++ b/Dockerfile @@ -138,7 +138,7 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build- SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE="" \ SAML_ATTRIBUTES="" \ ORACLE_OIM_ENABLED=false \ - DEFAULT_WAIT_SPINNER="" + WAIT_SPINNER="" # Copy the app to the image COPY ${SRC_PATH} /home/wekan/app diff --git a/client/lib/spinner.js b/client/lib/spinner.js index 7b52b7c34..d7078bda4 100644 --- a/client/lib/spinner.js +++ b/client/lib/spinner.js @@ -9,7 +9,7 @@ export class Spinner extends BlazeComponent { getSpinnerName() { let ret = 'Bounce'; - let defaultWaitSpinner = Meteor.settings.public.DEFAULT_WAIT_SPINNER; + let defaultWaitSpinner = Meteor.settings.public.WAIT_SPINNER; if (defaultWaitSpinner && ALLOWED_WAIT_SPINNERS.includes(defaultWaitSpinner)) { ret = defaultWaitSpinner; } diff --git a/docker-compose.yml b/docker-compose.yml index 6e2570378..57eff3b4f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -618,8 +618,8 @@ services: #- SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE= #- SAML_ATTRIBUTES= #--------------------------------------------------------------------- - # Default wait spinner to use - # - DEFAULT_WAIT_SPINNER=Bounce + # Wait spinner to use + # - WAIT_SPINNER=Bounce #--------------------------------------------------------------------- depends_on: - wekandb diff --git a/releases/virtualbox/start-wekan.sh b/releases/virtualbox/start-wekan.sh index 08d145f5f..9ee48e671 100755 --- a/releases/virtualbox/start-wekan.sh +++ b/releases/virtualbox/start-wekan.sh @@ -382,8 +382,8 @@ #export SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE= #export SAML_ATTRIBUTES= #--------------------------------------------------------------------- - # Default wait spinner to use - #export DEFAULT_WAIT_SPINNER=Bounce + # Wait spinner to use + #export WAIT_SPINNER=Bounce #--------------------------------------------------------------------- node main.js & >> ~/repos/wekan.log diff --git a/server/spinner.js b/server/spinner.js index 316641392..3697ae232 100644 --- a/server/spinner.js +++ b/server/spinner.js @@ -1,3 +1,3 @@ Meteor.startup(() => { - Meteor.settings.public.DEFAULT_WAIT_SPINNER = process.env.DEFAULT_WAIT_SPINNER; + Meteor.settings.public.WAIT_SPINNER = process.env.WAIT_SPINNER; }); diff --git a/snap-src/bin/config b/snap-src/bin/config index 9f0680859..83ce687be 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 MONGO_LOG_DESTINATION MONGO_URL MONGODB_BIND_UNIX_SOCKET MONGO_URL MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM ROOT_URL PORT DISABLE_MONGODB CADDY_ENABLED CADDY_BIND_PORT WITH_API RICHER_CARD_COMMENT_EDITOR CARD_OPENED_WEBHOOK_ENABLED 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 MAX_IMAGE_PIXEL IMAGE_COMPRESS_RATIO BIGEVENTS_PATTERN NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE NOTIFY_DUE_DAYS_BEFORE_AND_AFTER NOTIFY_DUE_AT_HOUR_OF_DAY EMAIL_NOTIFICATION_TIMEOUT CORS CORS_ALLOW_HEADERS CORS_EXPOSE_HEADERS MATOMO_ADDRESS MATOMO_SITE_ID MATOMO_DO_NOT_TRACK MATOMO_WITH_USERNAME BROWSER_POLICY_ENABLED TRUSTED_URL WEBHOOKS_ATTRIBUTES OAUTH2_ENABLED OAUTH2_CA_CERT OAUTH2_LOGIN_STYLE 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_ID_TOKEN_WHITELIST_FIELDS OAUTH2_EMAIL_MAP OAUTH2_REQUEST_PERMISSIONS OAUTH2_ADFS_ENABLED 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_AUTHENTICATION LDAP_USER_AUTHENTICATION_FIELD 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 ATTACHMENTS_STORE_PATH PASSWORD_LOGIN_ENABLED CAS_ENABLED CAS_BASE_URL CAS_LOGIN_URL CAS_VALIDATE_URL SAML_ENABLED SAML_PROVIDER SAML_ENTRYPOINT SAML_ISSUER SAML_CERT SAML_IDPSLO_REDIRECTURL SAML_PRIVATE_KEYFILE SAML_PUBLIC_CERTFILE SAML_IDENTIFIER_FORMAT SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE SAML_ATTRIBUTES ORACLE_OIM_ENABLED RESULTS_PER_PAGE DEFAULT_WAIT_SPINNER" +keys="DEBUG MONGO_LOG_DESTINATION MONGO_URL MONGODB_BIND_UNIX_SOCKET MONGO_URL MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM ROOT_URL PORT DISABLE_MONGODB CADDY_ENABLED CADDY_BIND_PORT WITH_API RICHER_CARD_COMMENT_EDITOR CARD_OPENED_WEBHOOK_ENABLED 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 MAX_IMAGE_PIXEL IMAGE_COMPRESS_RATIO BIGEVENTS_PATTERN NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE NOTIFY_DUE_DAYS_BEFORE_AND_AFTER NOTIFY_DUE_AT_HOUR_OF_DAY EMAIL_NOTIFICATION_TIMEOUT CORS CORS_ALLOW_HEADERS CORS_EXPOSE_HEADERS MATOMO_ADDRESS MATOMO_SITE_ID MATOMO_DO_NOT_TRACK MATOMO_WITH_USERNAME BROWSER_POLICY_ENABLED TRUSTED_URL WEBHOOKS_ATTRIBUTES OAUTH2_ENABLED OAUTH2_CA_CERT OAUTH2_LOGIN_STYLE 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_ID_TOKEN_WHITELIST_FIELDS OAUTH2_EMAIL_MAP OAUTH2_REQUEST_PERMISSIONS OAUTH2_ADFS_ENABLED 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_AUTHENTICATION LDAP_USER_AUTHENTICATION_FIELD 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 ATTACHMENTS_STORE_PATH PASSWORD_LOGIN_ENABLED CAS_ENABLED CAS_BASE_URL CAS_LOGIN_URL CAS_VALIDATE_URL SAML_ENABLED SAML_PROVIDER SAML_ENTRYPOINT SAML_ISSUER SAML_CERT SAML_IDPSLO_REDIRECTURL SAML_PRIVATE_KEYFILE SAML_PUBLIC_CERTFILE SAML_IDENTIFIER_FORMAT SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE SAML_ATTRIBUTES ORACLE_OIM_ENABLED RESULTS_PER_PAGE WAIT_SPINNER" # default values DESCRIPTION_DEBUG="Debug OIDC OAuth2 etc. Example: sudo snap set wekan debug='true'" diff --git a/snap-src/bin/wekan-help b/snap-src/bin/wekan-help index b544046f6..3f7a4c91c 100755 --- a/snap-src/bin/wekan-help +++ b/snap-src/bin/wekan-help @@ -544,6 +544,9 @@ echo -e "\n" echo -e "SAML Attributes." echo -e "\t$ snap set $SNAP_NAME saml-attributes=''" echo -e "\n" +echo -e "Wait spinner to use." +echo -e "\t$ snap set $SNAP_NAME wait-spinner='Bounce'" +echo -e "\n" # parse config file for supported settings keys echo -e "wekan supports settings keys" echo -e "values can be changed by calling\n$ snap set $SNAP_NAME =''" diff --git a/start-wekan.bat b/start-wekan.bat index 9399e0cec..64eeb405d 100644 --- a/start-wekan.bat +++ b/start-wekan.bat @@ -418,6 +418,7 @@ REM SET SAML_IDENTIFIER_FORMAT= REM SET SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE= REM SET SAML_ATTRIBUTES= -REM SET DEFAULT_WAIT_SPINNER= +REM # Wait spinner to use +REM SET WAIT_SPINNER=Bounce node main.js diff --git a/start-wekan.sh b/start-wekan.sh index da1b6fc0a..a4eeb31ae 100755 --- a/start-wekan.sh +++ b/start-wekan.sh @@ -388,8 +388,8 @@ #export SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE= #export SAML_ATTRIBUTES= #--------------------------------------------------------------------- - # Default wait spinner to use - #export DEFAULT_WAIT_SPINNER=Bounce + # Wait spinner to use + #export WAIT_SPINNER=Bounce #--------------------------------------------------------------------- node main.js # & >> ../../wekan.log diff --git a/torodb-postgresql/docker-compose.yml b/torodb-postgresql/docker-compose.yml index 8bfb11f71..29b7effc7 100644 --- a/torodb-postgresql/docker-compose.yml +++ b/torodb-postgresql/docker-compose.yml @@ -559,8 +559,8 @@ services: #- SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE= #- SAML_ATTRIBUTES= #--------------------------------------------------------------------- - # Default wait spinner to use - # - DEFAULT_WAIT_SPINNER=Bounce + # Wait spinner to use + #- WAIT_SPINNER=Bounce #--------------------------------------------------------------------- depends_on: From 01a28860fef6fe300094eefd8808e41ff8106153 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 11 Jun 2021 15:19:45 +0300 Subject: [PATCH 49/81] Updated ChangeLog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a18ab8c79..838f94462 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ This release adds the following new features: Thanks to mfilser. - [More spinners + configureable in admin panel](https://github.com/wekan/wekan/pull/3858). Thanks to mfilser. +- [Added remaining spinner settings](https://github.com/wekan/wekan/commit/488b765f95ad67b19630cd125543836c04eaa24f). + Thanks to xet7. and adds the following new improvements: From d09151d8f3fca8c16ac3c9bd7195db742dbdef6e Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 11 Jun 2021 15:22:55 +0300 Subject: [PATCH 50/81] Updated translations. --- i18n/he.i18n.json | 4 ++-- i18n/nl.i18n.json | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/i18n/he.i18n.json b/i18n/he.i18n.json index 024564a67..975d5a5cc 100644 --- a/i18n/he.i18n.json +++ b/i18n/he.i18n.json @@ -664,7 +664,7 @@ "setListColorPopup-title": "בחירת צבע", "assigned-by": "הוקצה על ידי", "requested-by": "התבקש על ידי", - "card-sorting-by-number": "Card sorting by number", + "card-sorting-by-number": "מיון כרטיסים לפי מספר", "board-delete-notice": "מחיקה היא לצמיתות. כל הרשימות, הכרטיבים והפעולות שקשורים בלוח הזה ילכו לאיבוד.", "delete-board-confirm-popup": "כל הרשימות, הכרטיסים, התווית והפעולות יימחקו ולא תהיה לך דרך לשחזר את תכני הלוח. אין אפשרות לבטל.", "boardDeletePopup-title": "למחוק את הלוח?", @@ -1039,5 +1039,5 @@ "copy-swimlane": "העתקת מסלול", "copySwimlanePopup-title": "העתקת מסלול", "display-card-creator": "להציג את יוצר הכרטיסים", - "wait-spinner": "Wait Spinner" + "wait-spinner": "שבשבת המתנה" } \ No newline at end of file diff --git a/i18n/nl.i18n.json b/i18n/nl.i18n.json index 3238168c2..346c15d79 100644 --- a/i18n/nl.i18n.json +++ b/i18n/nl.i18n.json @@ -133,7 +133,7 @@ "board-not-found": "Bord is niet gevonden", "board-private-info": "Dit bord is nu privé.", "board-public-info": "Dit bord is nu openbaar.", - "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "board-drag-drop-reorder-or-click-open": "Sleep en verplaats om iconen te herordenen. Klik bord-icoon om het bord te openen,", "boardChangeColorPopup-title": "Verander achtergrond van bord", "boardChangeTitlePopup-title": "Hernoem bord", "boardChangeVisibilityPopup-title": "Verander zichtbaarheid", @@ -233,7 +233,7 @@ "close": "Sluiten", "close-board": "Sluit bord", "close-board-pop": "Je kunt het bord terughalen door de \"Archief\" knop te klikken in de menubalk \"Mijn Borden\".", - "close-card": "Close Card", + "close-card": "Sluit Kaart", "color-black": "zwart", "color-blue": "blauw", "color-crimson": "karmijn", @@ -447,8 +447,8 @@ "set-color-list": "Wijzig kleur in", "listActionPopup-title": "Lijst acties", "settingsUserPopup-title": "Gebruiker Instellingen", - "settingsTeamPopup-title": "Team Settings", - "settingsOrgPopup-title": "Organization Settings", + "settingsTeamPopup-title": "Team Instellingen", + "settingsOrgPopup-title": "Organisatie Instellingen", "swimlaneActionPopup-title": "Swimlane handelingen", "swimlaneAddPopup-title": "Voeg hieronder een Swimlane toe", "listImportCardPopup-title": "Importeer een Trello kaart", @@ -664,7 +664,7 @@ "setListColorPopup-title": "Kies een kleur", "assigned-by": "Toegewezen door", "requested-by": "Aangevraagd door", - "card-sorting-by-number": "Card sorting by number", + "card-sorting-by-number": "Kaarten sorteren op nummer", "board-delete-notice": "Verwijdering kan niet ongedaan gemaakt worden. Je raakt alle met dit bord gerelateerde lijsten, kaarten en acties kwijt.", "delete-board-confirm-popup": "Alle lijsten, kaarten, labels en activiteiten zullen worden verwijderd en je kunt de bordinhoud niet terughalen. Er is geen herstelmogelijkheid. ", "boardDeletePopup-title": "Bord verwijderen?", @@ -846,8 +846,8 @@ "act-duenow": "wil je herinneren aan het vandaag verlopen van de huidige vervaldatum (__timeValue__) van __card__ ", "act-atUserComment": "Je werd genoemd in [__board__] __list__/__card__", "delete-user-confirm-popup": "Weet je zeker dat je dit account wilt verwijderen? Er is geen herstelmogelijkheid.", - "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", - "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "delete-team-confirm-popup": "Weet je zeker dat je dit team wilt verwijderen? Er is geen herstelmogelijkheid.", + "delete-org-confirm-popup": "Weet je zeker dat je deze organisatie wilt verwijderen? Er is geen herstelmogelijkheid.", "accounts-allowUserDelete": "Sta gebruikers toe om hun eigen account te verwijderen", "hide-minicard-label-text": "Verberg minikaart labeltekst", "show-desktop-drag-handles": "Toon sleep gereedschap op werkblad", @@ -858,8 +858,8 @@ "new": "Nieuw", "editOrgPopup-title": "Wijzig organisatie", "newOrgPopup-title": "Nieuwe organisatie", - "editTeamPopup-title": "Wijzig team", - "newTeamPopup-title": "Nieuw team", + "editTeamPopup-title": "Wijzig Team", + "newTeamPopup-title": "Nieuw Team", "editUserPopup-title": "Wijzig gebruiker", "newUserPopup-title": "Nieuwe gebruiker", "notifications": "Meldingen", @@ -1039,5 +1039,5 @@ "copy-swimlane": "Kopieer Swimlane", "copySwimlanePopup-title": "Kopieer Swimlane", "display-card-creator": "Toon Aanmaker Kaart", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wacht Spinner" } \ No newline at end of file From d0c417b17d613e5d48562faa083122b2a67dc63d Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 11 Jun 2021 15:35:13 +0300 Subject: [PATCH 51/81] v5.34 --- CHANGELOG.md | 2 +- Stackerfile.yml | 2 +- package-lock.json | 2 +- package.json | 2 +- public/api/wekan.html | 15 ++++++++++++--- public/api/wekan.yml | 7 ++++++- sandstorm-pkgdef.capnp | 4 ++-- snapcraft.yaml | 2 +- 8 files changed, 25 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 838f94462..1ceba8c6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ [Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac) -# Upcoming Wekan release +# v5.34 2021-06-11 Wekan release This release adds the following new features: diff --git a/Stackerfile.yml b/Stackerfile.yml index bb76927dc..bb95699c8 100644 --- a/Stackerfile.yml +++ b/Stackerfile.yml @@ -1,5 +1,5 @@ appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928 -appVersion: "v5.33.0" +appVersion: "v5.34.0" files: userUploads: - README.md diff --git a/package-lock.json b/package-lock.json index ca1a17125..3bb1163f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v5.33.0", + "version": "v5.34.0", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/package.json b/package.json index d03d4ea44..3c7ec3af7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v5.33.0", + "version": "v5.34.0", "description": "Open-Source kanban", "private": true, "repository": { diff --git a/public/api/wekan.html b/public/api/wekan.html index 825c81e24..da2758133 100644 --- a/public/api/wekan.html +++ b/public/api/wekan.html @@ -7,7 +7,7 @@ - Wekan REST API v5.33 + Wekan REST API v5.34 @@ -1553,7 +1553,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
    • - Wekan REST API v5.33 + Wekan REST API v5.34
    • @@ -2116,7 +2116,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
      -

      Wekan REST API v5.33

      +

      Wekan REST API v5.34

      Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

      @@ -3534,6 +3534,7 @@ System.out.println(response.toString()); "allowsAssignee": true, "allowsMembers": true, "allowsRequestedBy": true, + "allowsCardSortingByNumber": true, "allowsAssignedBy": true, "allowsReceivedDate": true, "allowsStartDate": true, @@ -18309,6 +18310,7 @@ UserSecurity "allowsAssignee": true, "allowsMembers": true, "allowsRequestedBy": true, + "allowsCardSortingByNumber": true, "allowsAssignedBy": true, "allowsReceivedDate": true, "allowsStartDate": true, @@ -18535,6 +18537,13 @@ UserSecurity
    + + + + + + + diff --git a/public/api/wekan.yml b/public/api/wekan.yml index e65da329d..1c4d703d3 100644 --- a/public/api/wekan.yml +++ b/public/api/wekan.yml @@ -1,7 +1,7 @@ swagger: '2.0' info: title: Wekan REST API - version: v5.33 + version: v5.34 description: | The REST API allows you to control and extend Wekan with ease. @@ -2780,6 +2780,10 @@ definitions: description: | Does the board allows requested by? type: boolean + allowsCardSortingByNumber: + description: | + Does the board allows card sorting by number? + type: boolean allowsAssignedBy: description: | Does the board allows requested by? @@ -2876,6 +2880,7 @@ definitions: - allowsAssignee - allowsMembers - allowsRequestedBy + - allowsCardSortingByNumber - allowsAssignedBy - allowsReceivedDate - allowsStartDate diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index 358d534f3..f8e423f50 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 = 533, + appVersion = 534, # Increment this for every release. - appMarketingVersion = (defaultText = "5.33.0~2021-06-10"), + appMarketingVersion = (defaultText = "5.34.0~2021-06-11"), # Human-readable presentation of the app version. minUpgradableAppVersion = 0, diff --git a/snapcraft.yaml b/snapcraft.yaml index 7ff85a134..e8bdb8005 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -1,5 +1,5 @@ name: wekan -version: '5.33' +version: '5.34' summary: The open-source kanban description: | Wekan is an open-source and collaborative kanban board application. From 8703dd42296d531450eb21a3d3adea17558a8500 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 11 Jun 2021 20:35:27 +0300 Subject: [PATCH 52/81] Wait Spinners can now be translated. Added Wait Spinners docs: https://github.com/wekan/wekan/wiki/Wait-Spinners Thanks to xet7 ! --- client/components/settings/settingBody.jade | 4 ++-- i18n/en.i18n.json | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/client/components/settings/settingBody.jade b/client/components/settings/settingBody.jade index bd69e21ad..76f8ae95c 100644 --- a/client/components/settings/settingBody.jade +++ b/client/components/settings/settingBody.jade @@ -230,6 +230,6 @@ template(name='selectSpinnerName') select#spinnerName each spinner in spinners if isSelected spinner - option(value="{{spinner}}" selected) {{spinner}} + option(value="{{spinner}}" selected) {{_ spinner}} else - option(value="{{spinner}}") {{spinner}} + option(value="{{spinner}}") {{_ spinner}} diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index 11920de5e..bd35e5064 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -1040,5 +1040,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } From 865a585c7f16b5dc03ab7849acf1da61ae05436b Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 11 Jun 2021 20:38:24 +0300 Subject: [PATCH 53/81] Updated ChangeLog. --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ceba8c6a..9b5bf2e5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ [Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac) +# Upcoming Wekan release + +This release adds the following new features: + +- [Wait Spinners can now be translated](https://github.com/wekan/wekan/commit/8703dd42296d531450eb21a3d3adea17558a8500). + Added Wait Spinners docs: https://github.com/wekan/wekan/wiki/Wait-Spinners . + Thanks to xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + # v5.34 2021-06-11 Wekan release This release adds the following new features: From c810c689232b54ce4e5432af7a80824f54c46e39 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 11 Jun 2021 20:49:55 +0300 Subject: [PATCH 54/81] Updated translations. --- i18n/ar-EG.i18n.json | 9 +++++++- i18n/ar.i18n.json | 9 +++++++- i18n/bg.i18n.json | 9 +++++++- i18n/br.i18n.json | 9 +++++++- i18n/ca.i18n.json | 9 +++++++- i18n/cs.i18n.json | 9 +++++++- i18n/da.i18n.json | 9 +++++++- i18n/de-CH.i18n.json | 9 +++++++- i18n/de.i18n.json | 51 +++++++++++++++++++++++++------------------- i18n/el.i18n.json | 9 +++++++- i18n/en-GB.i18n.json | 9 +++++++- i18n/eo.i18n.json | 9 +++++++- i18n/es-AR.i18n.json | 9 +++++++- i18n/es-CL.i18n.json | 9 +++++++- i18n/es-LA.i18n.json | 9 +++++++- i18n/es-MX.i18n.json | 9 +++++++- i18n/es-PE.i18n.json | 9 +++++++- i18n/es-PY.i18n.json | 9 +++++++- i18n/es.i18n.json | 9 +++++++- i18n/eu.i18n.json | 9 +++++++- i18n/fa-IR.i18n.json | 9 +++++++- i18n/fa.i18n.json | 9 +++++++- i18n/fi.i18n.json | 9 +++++++- i18n/fr.i18n.json | 11 ++++++++-- i18n/gl.i18n.json | 9 +++++++- i18n/he.i18n.json | 9 +++++++- i18n/hi.i18n.json | 9 +++++++- i18n/hr.i18n.json | 9 +++++++- i18n/hu.i18n.json | 9 +++++++- i18n/hy.i18n.json | 9 +++++++- i18n/id.i18n.json | 9 +++++++- i18n/ig.i18n.json | 9 +++++++- i18n/it.i18n.json | 9 +++++++- i18n/ja.i18n.json | 9 +++++++- i18n/ka.i18n.json | 9 +++++++- i18n/km.i18n.json | 9 +++++++- i18n/ko.i18n.json | 9 +++++++- i18n/lt.i18n.json | 9 +++++++- i18n/lv.i18n.json | 9 +++++++- i18n/mk.i18n.json | 9 +++++++- i18n/mn.i18n.json | 9 +++++++- i18n/nb.i18n.json | 9 +++++++- i18n/nl.i18n.json | 9 +++++++- i18n/oc.i18n.json | 9 +++++++- i18n/pa.i18n.json | 9 +++++++- i18n/pl.i18n.json | 9 +++++++- i18n/pt-BR.i18n.json | 11 ++++++++-- i18n/pt.i18n.json | 9 +++++++- i18n/ro.i18n.json | 9 +++++++- i18n/ru.i18n.json | 9 +++++++- i18n/sk.i18n.json | 9 +++++++- i18n/sl.i18n.json | 9 +++++++- i18n/sr.i18n.json | 9 +++++++- i18n/sv.i18n.json | 9 +++++++- i18n/sw.i18n.json | 9 +++++++- i18n/ta.i18n.json | 9 +++++++- i18n/th.i18n.json | 9 +++++++- i18n/tr.i18n.json | 9 +++++++- i18n/uk.i18n.json | 9 +++++++- i18n/vi.i18n.json | 9 +++++++- i18n/zh-CN.i18n.json | 9 +++++++- i18n/zh-HK.i18n.json | 9 +++++++- i18n/zh-TW.i18n.json | 9 +++++++- 63 files changed, 527 insertions(+), 86 deletions(-) diff --git a/i18n/ar-EG.i18n.json b/i18n/ar-EG.i18n.json index 16f0f2bc8..65b86284c 100644 --- a/i18n/ar-EG.i18n.json +++ b/i18n/ar-EG.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/ar.i18n.json b/i18n/ar.i18n.json index c7e6db947..3faa8c92f 100644 --- a/i18n/ar.i18n.json +++ b/i18n/ar.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/bg.i18n.json b/i18n/bg.i18n.json index 97e9fbb56..56670cafb 100644 --- a/i18n/bg.i18n.json +++ b/i18n/bg.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/br.i18n.json b/i18n/br.i18n.json index c06cd3226..7034d7a0b 100644 --- a/i18n/br.i18n.json +++ b/i18n/br.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/ca.i18n.json b/i18n/ca.i18n.json index ac10c2bfb..1c84ee9f4 100644 --- a/i18n/ca.i18n.json +++ b/i18n/ca.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/cs.i18n.json b/i18n/cs.i18n.json index e8e04fabc..c914a9852 100644 --- a/i18n/cs.i18n.json +++ b/i18n/cs.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Kopírovat dráhu", "copySwimlanePopup-title": "Kopírovat dráhu", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/da.i18n.json b/i18n/da.i18n.json index 048120c9c..c7bbd5a02 100644 --- a/i18n/da.i18n.json +++ b/i18n/da.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/de-CH.i18n.json b/i18n/de-CH.i18n.json index 286bf59d0..572f51d16 100644 --- a/i18n/de-CH.i18n.json +++ b/i18n/de-CH.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Swimlane kopieren", "copySwimlanePopup-title": "Swimlane kopieren", "display-card-creator": "Zeige Karten-Erstellung", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json index 9a2e3aefc..aec8c95ae 100644 --- a/i18n/de.i18n.json +++ b/i18n/de.i18n.json @@ -82,8 +82,8 @@ "add-attachment": "Datei anhängen", "add-board": "neues Board", "add-card": "Karte hinzufügen", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-card-to-top-of-list": "Karte am Anfang der Liste hinzufügen", + "add-card-to-bottom-of-list": "Karte am Ende der Liste hinzufügen", "add-swimlane": "Swimlane hinzufügen", "add-subtask": "Teilaufgabe hinzufügen", "add-checklist": "Checkliste hinzufügen", @@ -133,7 +133,7 @@ "board-not-found": "Board nicht gefunden", "board-private-info": "Dieses Board wird privat sein.", "board-public-info": "Dieses Board wird öffentlich sein.", - "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "board-drag-drop-reorder-or-click-open": "Benutze Drag-and-Drop, um Board-Icons neu anzuordnen. Klicke auf ein Board-Icon, um das Board zu öffnen.", "boardChangeColorPopup-title": "Farbe des Boards ändern", "boardChangeTitlePopup-title": "Board umbenennen", "boardChangeVisibilityPopup-title": "Sichtbarkeit ändern", @@ -181,10 +181,10 @@ "vote-against": "Dagegen", "deleteVotePopup-title": "Wahl löschen?", "vote-delete-pop": "Löschen ist unwiderruflich. Alle Aktionen die dieser Karte zugeordnet sind werden ebenfalls gelöscht.", - "cardStartPlanningPokerPopup-title": "Start a Planning Poker", - "card-edit-planning-poker": "Edit Planning Poker", - "editPokerEndDatePopup-title": "Change Planning Poker vote end date", - "poker-question": "Planning Poker", + "cardStartPlanningPokerPopup-title": "Planungspoker starten", + "card-edit-planning-poker": "Planungspoker ändern", + "editPokerEndDatePopup-title": "Enddatum für Planungspoker-Stimme ändern", + "poker-question": "Planungspoker", "poker-one": "1", "poker-two": "2", "poker-three": "3", @@ -195,13 +195,13 @@ "poker-forty": "40", "poker-oneHundred": "100", "poker-unsure": "?", - "poker-finish": "Finish", - "poker-result-votes": "Votes", - "poker-result-who": "Who", - "poker-replay": "Replay", - "set-estimation": "Set Estimation", - "deletePokerPopup-title": "Delete planning poker?", - "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "poker-finish": "Beenden", + "poker-result-votes": "Werte", + "poker-result-who": "Wer", + "poker-replay": "Wiederholen", + "set-estimation": "Schätzung vornehmen", + "deletePokerPopup-title": "Planungspoker löschen?", + "poker-delete-pop": "Die Löschung ist permanent. Sie werden alles im Zusammenhang mit diesem Planungspoker verlieren.", "cardDeletePopup-title": "Karte löschen?", "cardDetailsActionsPopup-title": "Kartenaktionen", "cardLabelsPopup-title": "Labels", @@ -233,7 +233,7 @@ "close": "Schließen", "close-board": "Board schließen", "close-board-pop": "Sie können das Board wiederherstellen, indem Sie die Schaltfläche \"Archiv\" in der Kopfzeile der Startseite anklicken.", - "close-card": "Close Card", + "close-card": "Karte schließen", "color-black": "schwarz", "color-blue": "blau", "color-crimson": "Karminrot", @@ -447,8 +447,8 @@ "set-color-list": "Lege Farbe fest", "listActionPopup-title": "Listenaktionen", "settingsUserPopup-title": "Benutzereinstellungen", - "settingsTeamPopup-title": "Team Settings", - "settingsOrgPopup-title": "Organization Settings", + "settingsTeamPopup-title": "Team-Einstellungen", + "settingsOrgPopup-title": "Organisations-Einstellungen", "swimlaneActionPopup-title": "Swimlaneaktionen", "swimlaneAddPopup-title": "Swimlane unterhalb einfügen", "listImportCardPopup-title": "Eine Trello-Karte importieren", @@ -664,7 +664,7 @@ "setListColorPopup-title": "Farbe wählen", "assigned-by": "Zugewiesen von", "requested-by": "Angefordert von", - "card-sorting-by-number": "Card sorting by number", + "card-sorting-by-number": "Kartensortierung nach Nummer", "board-delete-notice": "Löschen kann nicht rückgängig gemacht werden. Sie werden alle Listen, Karten und Aktionen, die mit diesem Board verbunden sind, verlieren.", "delete-board-confirm-popup": "Alle Listen, Karten, Labels und Akivitäten werden gelöscht und Sie können die Inhalte des Boards nicht wiederherstellen! Die Aktion kann nicht rückgängig gemacht werden.", "boardDeletePopup-title": "Board löschen?", @@ -846,8 +846,8 @@ "act-duenow": "erinnernd an das aktuelle Fälligkeitszeitpunkt (__timeValue__) von __card__ ist jetzt", "act-atUserComment": "Sie wurden in [__board__] __list__/__card__ erwähnt", "delete-user-confirm-popup": "Sind Sie sicher, dass Sie diesen Account löschen wollen? Die Aktion kann nicht rückgängig gemacht werden.", - "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", - "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "delete-team-confirm-popup": "Sind Sie sicher, daß Sie dieses Team löschen wollen? Es gibt keine Möglichkeit, das rückgängig zu machen.", + "delete-org-confirm-popup": "Sind Sie sicher, daß Sie diese Organisation löschen wollen? Es gibt keine Möglichkeit, das rückgängig zu machen.", "accounts-allowUserDelete": "Erlaube Benutzern ihren eigenen Account zu löschen", "hide-minicard-label-text": "Labeltext auf Minikarte ausblenden", "show-desktop-drag-handles": "Desktop-Ziehpunkte anzeigen", @@ -1038,6 +1038,13 @@ "rulesReportTitle": "Regeln-Bericht", "copy-swimlane": "Kopiere Swimlane", "copySwimlanePopup-title": "Swimlane kopieren", - "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "display-card-creator": "Karten-Ersteller anzeigen", + "wait-spinner": "Warte-Symbol", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/el.i18n.json b/i18n/el.i18n.json index 1ac5100f7..a7d93c2c6 100644 --- a/i18n/el.i18n.json +++ b/i18n/el.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/en-GB.i18n.json b/i18n/en-GB.i18n.json index 406d2495f..08f562368 100644 --- a/i18n/en-GB.i18n.json +++ b/i18n/en-GB.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/eo.i18n.json b/i18n/eo.i18n.json index 26caabb75..657a6370e 100644 --- a/i18n/eo.i18n.json +++ b/i18n/eo.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/es-AR.i18n.json b/i18n/es-AR.i18n.json index 58646c4b4..a46fac4ca 100644 --- a/i18n/es-AR.i18n.json +++ b/i18n/es-AR.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/es-CL.i18n.json b/i18n/es-CL.i18n.json index 44243a62d..b092c9fc3 100644 --- a/i18n/es-CL.i18n.json +++ b/i18n/es-CL.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/es-LA.i18n.json b/i18n/es-LA.i18n.json index 16f0f2bc8..65b86284c 100644 --- a/i18n/es-LA.i18n.json +++ b/i18n/es-LA.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/es-MX.i18n.json b/i18n/es-MX.i18n.json index 968de3ee3..0b6aee84e 100644 --- a/i18n/es-MX.i18n.json +++ b/i18n/es-MX.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/es-PE.i18n.json b/i18n/es-PE.i18n.json index 44aa20970..6eb38257f 100644 --- a/i18n/es-PE.i18n.json +++ b/i18n/es-PE.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/es-PY.i18n.json b/i18n/es-PY.i18n.json index 16f0f2bc8..65b86284c 100644 --- a/i18n/es-PY.i18n.json +++ b/i18n/es-PY.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/es.i18n.json b/i18n/es.i18n.json index 2616c5073..a8638e54e 100644 --- a/i18n/es.i18n.json +++ b/i18n/es.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/eu.i18n.json b/i18n/eu.i18n.json index 84eb75af0..91442e968 100644 --- a/i18n/eu.i18n.json +++ b/i18n/eu.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/fa-IR.i18n.json b/i18n/fa-IR.i18n.json index e342cd226..9c24a9f37 100644 --- a/i18n/fa-IR.i18n.json +++ b/i18n/fa-IR.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/fa.i18n.json b/i18n/fa.i18n.json index f8cdd37ae..7325b24a6 100644 --- a/i18n/fa.i18n.json +++ b/i18n/fa.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "کپی از مسیر", "copySwimlanePopup-title": "کپی از مسیر", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/fi.i18n.json b/i18n/fi.i18n.json index bd30e8e6b..8f50ffcf6 100644 --- a/i18n/fi.i18n.json +++ b/i18n/fi.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Kopioi Swimlane", "copySwimlanePopup-title": "Kopioi Swimlane", "display-card-creator": "Näytä kortin luoja", - "wait-spinner": "Odotus pyörijä" + "wait-spinner": "Odotus pyörijä", + "Bounce": "Pomppu odotus pyörijä", + "Cube": "Kuutio odotus pyörijä", + "Cube-Grid": "Kuutio ristikko odotus pyörijä", + "Dot": "Piste odotus pyörijä", + "Rotateplane": "Pyöritä tasoa odotus pyörijä", + "Scaleout": "Skaalaus ulos odotus pyörijä", + "Wave": "Aalto odotus pyörijä" } \ No newline at end of file diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json index 6dccb5c3a..d9b062a65 100644 --- a/i18n/fr.i18n.json +++ b/i18n/fr.i18n.json @@ -664,7 +664,7 @@ "setListColorPopup-title": "Choisissez une couleur", "assigned-by": "Assigné par", "requested-by": "Demandé par", - "card-sorting-by-number": "Card sorting by number", + "card-sorting-by-number": "Tri numérique des cartes", "board-delete-notice": "La suppression est définitive. Vous perdrez toutes les listes, cartes et actions associées à ce tableau.", "delete-board-confirm-popup": "Toutes les listes, cartes, étiquettes et activités seront supprimées et vous ne pourrez pas retrouver le contenu du tableau. Il n'y a pas d'annulation possible.", "boardDeletePopup-title": "Supprimer le tableau ?", @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copier le couloir", "copySwimlanePopup-title": "Copie de Couloir", "display-card-creator": "Afficher le créateur de la carte", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Icône d'attente", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/gl.i18n.json b/i18n/gl.i18n.json index 37836f451..d13a8cce8 100644 --- a/i18n/gl.i18n.json +++ b/i18n/gl.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/he.i18n.json b/i18n/he.i18n.json index 975d5a5cc..ef69ac271 100644 --- a/i18n/he.i18n.json +++ b/i18n/he.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "העתקת מסלול", "copySwimlanePopup-title": "העתקת מסלול", "display-card-creator": "להציג את יוצר הכרטיסים", - "wait-spinner": "שבשבת המתנה" + "wait-spinner": "שבשבת המתנה", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/hi.i18n.json b/i18n/hi.i18n.json index 86748a914..00d63be4b 100644 --- a/i18n/hi.i18n.json +++ b/i18n/hi.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/hr.i18n.json b/i18n/hr.i18n.json index 6ec7fab0c..2f224c4df 100644 --- a/i18n/hr.i18n.json +++ b/i18n/hr.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/hu.i18n.json b/i18n/hu.i18n.json index 94e274228..b8e59ecad 100644 --- a/i18n/hu.i18n.json +++ b/i18n/hu.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/hy.i18n.json b/i18n/hy.i18n.json index b5b861ff9..dc9ada112 100644 --- a/i18n/hy.i18n.json +++ b/i18n/hy.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/id.i18n.json b/i18n/id.i18n.json index a398e7e6f..f06861ac6 100644 --- a/i18n/id.i18n.json +++ b/i18n/id.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/ig.i18n.json b/i18n/ig.i18n.json index 0520bd582..9d53a57e8 100644 --- a/i18n/ig.i18n.json +++ b/i18n/ig.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json index 5e91c95d0..11c7b4747 100644 --- a/i18n/it.i18n.json +++ b/i18n/it.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/ja.i18n.json b/i18n/ja.i18n.json index 70b87da7e..24f3c8637 100644 --- a/i18n/ja.i18n.json +++ b/i18n/ja.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "スイムレーンをコピーする", "copySwimlanePopup-title": "スイムレーンをコピーする", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/ka.i18n.json b/i18n/ka.i18n.json index ffb916fc0..86721c63c 100644 --- a/i18n/ka.i18n.json +++ b/i18n/ka.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/km.i18n.json b/i18n/km.i18n.json index e35581280..ad3830bbc 100644 --- a/i18n/km.i18n.json +++ b/i18n/km.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/ko.i18n.json b/i18n/ko.i18n.json index f10032d83..488420240 100644 --- a/i18n/ko.i18n.json +++ b/i18n/ko.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/lt.i18n.json b/i18n/lt.i18n.json index 16f0f2bc8..65b86284c 100644 --- a/i18n/lt.i18n.json +++ b/i18n/lt.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/lv.i18n.json b/i18n/lv.i18n.json index e522b7190..7ae0eea80 100644 --- a/i18n/lv.i18n.json +++ b/i18n/lv.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/mk.i18n.json b/i18n/mk.i18n.json index 7f871ce93..d7cf599a9 100644 --- a/i18n/mk.i18n.json +++ b/i18n/mk.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/mn.i18n.json b/i18n/mn.i18n.json index d07dddc58..4df3ad83a 100644 --- a/i18n/mn.i18n.json +++ b/i18n/mn.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/nb.i18n.json b/i18n/nb.i18n.json index ab0d78928..2b97fa14f 100644 --- a/i18n/nb.i18n.json +++ b/i18n/nb.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Kopiér Svømmebane", "copySwimlanePopup-title": "Kopiér Svømmebane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/nl.i18n.json b/i18n/nl.i18n.json index 346c15d79..9c04748a7 100644 --- a/i18n/nl.i18n.json +++ b/i18n/nl.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Kopieer Swimlane", "copySwimlanePopup-title": "Kopieer Swimlane", "display-card-creator": "Toon Aanmaker Kaart", - "wait-spinner": "Wacht Spinner" + "wait-spinner": "Wacht Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/oc.i18n.json b/i18n/oc.i18n.json index 82e1d2cf7..568a0212f 100644 --- a/i18n/oc.i18n.json +++ b/i18n/oc.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/pa.i18n.json b/i18n/pa.i18n.json index 16f0f2bc8..65b86284c 100644 --- a/i18n/pa.i18n.json +++ b/i18n/pa.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/pl.i18n.json b/i18n/pl.i18n.json index fd710d734..496170389 100644 --- a/i18n/pl.i18n.json +++ b/i18n/pl.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Skopiuj ścieżkę", "copySwimlanePopup-title": "Kopiowanie ścieżki", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/pt-BR.i18n.json b/i18n/pt-BR.i18n.json index a5437d51e..55748897f 100644 --- a/i18n/pt-BR.i18n.json +++ b/i18n/pt-BR.i18n.json @@ -664,7 +664,7 @@ "setListColorPopup-title": "Escolha uma cor", "assigned-by": "Atribuído por", "requested-by": "Solicitado por", - "card-sorting-by-number": "Card sorting by number", + "card-sorting-by-number": "Ordenar cartões por número", "board-delete-notice": "Excluir é permanente. Você perderá todas as listas, cartões e ações associados nesse quadro.", "delete-board-confirm-popup": "Todas as listas, cartões, etiquetas e atividades serão excluídas e você não poderá recuperar o conteúdo do quadro. Não há como desfazer.", "boardDeletePopup-title": "Excluir quadro?", @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copiar Raia", "copySwimlanePopup-title": "Copiar Raia", "display-card-creator": "Exibir Criador do Cartão", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Aguarde o carregamento", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/pt.i18n.json b/i18n/pt.i18n.json index 7092d02d2..615056d8b 100644 --- a/i18n/pt.i18n.json +++ b/i18n/pt.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copiar Pista", "copySwimlanePopup-title": "Copiar Pista", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/ro.i18n.json b/i18n/ro.i18n.json index f6d7f9338..f4f166f8e 100644 --- a/i18n/ro.i18n.json +++ b/i18n/ro.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/ru.i18n.json b/i18n/ru.i18n.json index 5fee8a9f4..4f5bd0ae8 100644 --- a/i18n/ru.i18n.json +++ b/i18n/ru.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Скопировать дорожку", "copySwimlanePopup-title": "Скопировать дорожку", "display-card-creator": "Показать создателя карты", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/sk.i18n.json b/i18n/sk.i18n.json index f8a1439c5..3d2294d75 100644 --- a/i18n/sk.i18n.json +++ b/i18n/sk.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/sl.i18n.json b/i18n/sl.i18n.json index 7bf8046a3..dfbec3eb6 100644 --- a/i18n/sl.i18n.json +++ b/i18n/sl.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/sr.i18n.json b/i18n/sr.i18n.json index 2cdc533bf..5f42babb0 100644 --- a/i18n/sr.i18n.json +++ b/i18n/sr.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/sv.i18n.json b/i18n/sv.i18n.json index 5d6fa2902..1e2257c8d 100644 --- a/i18n/sv.i18n.json +++ b/i18n/sv.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/sw.i18n.json b/i18n/sw.i18n.json index eb1fdec48..7f0557f0e 100644 --- a/i18n/sw.i18n.json +++ b/i18n/sw.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/ta.i18n.json b/i18n/ta.i18n.json index 3b7736752..1cf37bb2b 100644 --- a/i18n/ta.i18n.json +++ b/i18n/ta.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/th.i18n.json b/i18n/th.i18n.json index 3e51d40e3..d17069898 100644 --- a/i18n/th.i18n.json +++ b/i18n/th.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/tr.i18n.json b/i18n/tr.i18n.json index 6d43d89c0..d3ecbaec3 100644 --- a/i18n/tr.i18n.json +++ b/i18n/tr.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/uk.i18n.json b/i18n/uk.i18n.json index a09da9c47..1d8846f4d 100644 --- a/i18n/uk.i18n.json +++ b/i18n/uk.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/vi.i18n.json b/i18n/vi.i18n.json index 6f5ee5687..286cb8623 100644 --- a/i18n/vi.i18n.json +++ b/i18n/vi.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Sao chép Làn ngang", "copySwimlanePopup-title": "Sao chép Làn ngang", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/zh-CN.i18n.json b/i18n/zh-CN.i18n.json index d9db9155a..b70ed902a 100644 --- a/i18n/zh-CN.i18n.json +++ b/i18n/zh-CN.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "复制泳道", "copySwimlanePopup-title": "复制泳道", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/zh-HK.i18n.json b/i18n/zh-HK.i18n.json index fbe1713f8..123c28d79 100644 --- a/i18n/zh-HK.i18n.json +++ b/i18n/zh-HK.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file diff --git a/i18n/zh-TW.i18n.json b/i18n/zh-TW.i18n.json index af13522a5..88587970d 100644 --- a/i18n/zh-TW.i18n.json +++ b/i18n/zh-TW.i18n.json @@ -1039,5 +1039,12 @@ "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner" + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner" } \ No newline at end of file From 7f3f0825573b1f8a7b0388e4bacbb0bd2525e886 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 11 Jun 2021 20:54:52 +0300 Subject: [PATCH 55/81] Added more translations for Wait Spinners. Thanks to xet7 ! --- i18n/en.i18n.json | 1 + 1 file changed, 1 insertion(+) diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index bd35e5064..9a0254654 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -1045,6 +1045,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" From d84b04dc35848102b4b6d8f9c0fdcf796ce6dbb1 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 11 Jun 2021 20:56:23 +0300 Subject: [PATCH 56/81] Updated ChangeLog. --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b5bf2e5e..fa0847115 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,9 @@ This release adds the following new features: -- [Wait Spinners can now be translated](https://github.com/wekan/wekan/commit/8703dd42296d531450eb21a3d3adea17558a8500). +- Wait Spinners can now be translated + [Part 1](https://github.com/wekan/wekan/commit/8703dd42296d531450eb21a3d3adea17558a8500), + [Part 1](https://github.com/wekan/wekan/commit/7f3f0825573b1f8a7b0388e4bacbb0bd2525e886). Added Wait Spinners docs: https://github.com/wekan/wekan/wiki/Wait-Spinners . Thanks to xet7. From a9d2e03b65e3bda9e0878ec8846db9c2430d725b Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 11 Jun 2021 21:01:38 +0300 Subject: [PATCH 57/81] Updated translations. --- i18n/ar-EG.i18n.json | 1 + i18n/ar.i18n.json | 1 + i18n/bg.i18n.json | 1 + i18n/br.i18n.json | 1 + i18n/ca.i18n.json | 1 + i18n/cs.i18n.json | 1 + i18n/da.i18n.json | 1 + i18n/de-CH.i18n.json | 1 + i18n/de.i18n.json | 1 + i18n/el.i18n.json | 1 + i18n/en-GB.i18n.json | 1 + i18n/eo.i18n.json | 1 + i18n/es-AR.i18n.json | 1 + i18n/es-CL.i18n.json | 1 + i18n/es-LA.i18n.json | 1 + i18n/es-MX.i18n.json | 1 + i18n/es-PE.i18n.json | 1 + i18n/es-PY.i18n.json | 1 + i18n/es.i18n.json | 1 + i18n/eu.i18n.json | 1 + i18n/fa-IR.i18n.json | 1 + i18n/fa.i18n.json | 1 + i18n/fi.i18n.json | 1 + i18n/fr.i18n.json | 1 + i18n/gl.i18n.json | 1 + i18n/he.i18n.json | 1 + i18n/hi.i18n.json | 1 + i18n/hr.i18n.json | 1 + i18n/hu.i18n.json | 1 + i18n/hy.i18n.json | 1 + i18n/id.i18n.json | 1 + i18n/ig.i18n.json | 1 + i18n/it.i18n.json | 1 + i18n/ja.i18n.json | 1 + i18n/ka.i18n.json | 1 + i18n/km.i18n.json | 1 + i18n/ko.i18n.json | 1 + i18n/lt.i18n.json | 1 + i18n/lv.i18n.json | 1 + i18n/mk.i18n.json | 1 + i18n/mn.i18n.json | 1 + i18n/nb.i18n.json | 1 + i18n/nl.i18n.json | 1 + i18n/oc.i18n.json | 1 + i18n/pa.i18n.json | 1 + i18n/pl.i18n.json | 1 + i18n/pt-BR.i18n.json | 1 + i18n/pt.i18n.json | 1 + i18n/ro.i18n.json | 1 + i18n/ru.i18n.json | 1 + i18n/sk.i18n.json | 1 + i18n/sl.i18n.json | 1 + i18n/sr.i18n.json | 1 + i18n/sv.i18n.json | 1 + i18n/sw.i18n.json | 1 + i18n/ta.i18n.json | 1 + i18n/th.i18n.json | 1 + i18n/tr.i18n.json | 1 + i18n/uk.i18n.json | 1 + i18n/vi.i18n.json | 1 + i18n/zh-CN.i18n.json | 1 + i18n/zh-HK.i18n.json | 1 + i18n/zh-TW.i18n.json | 1 + 63 files changed, 63 insertions(+) diff --git a/i18n/ar-EG.i18n.json b/i18n/ar-EG.i18n.json index 65b86284c..f127b1b7f 100644 --- a/i18n/ar-EG.i18n.json +++ b/i18n/ar-EG.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/ar.i18n.json b/i18n/ar.i18n.json index 3faa8c92f..dbbcdd7e2 100644 --- a/i18n/ar.i18n.json +++ b/i18n/ar.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/bg.i18n.json b/i18n/bg.i18n.json index 56670cafb..78ce9bf2a 100644 --- a/i18n/bg.i18n.json +++ b/i18n/bg.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/br.i18n.json b/i18n/br.i18n.json index 7034d7a0b..1f3877d47 100644 --- a/i18n/br.i18n.json +++ b/i18n/br.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/ca.i18n.json b/i18n/ca.i18n.json index 1c84ee9f4..92a13c399 100644 --- a/i18n/ca.i18n.json +++ b/i18n/ca.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/cs.i18n.json b/i18n/cs.i18n.json index c914a9852..2374437aa 100644 --- a/i18n/cs.i18n.json +++ b/i18n/cs.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/da.i18n.json b/i18n/da.i18n.json index c7bbd5a02..9c15118fc 100644 --- a/i18n/da.i18n.json +++ b/i18n/da.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/de-CH.i18n.json b/i18n/de-CH.i18n.json index 572f51d16..d4dbff42b 100644 --- a/i18n/de-CH.i18n.json +++ b/i18n/de-CH.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json index aec8c95ae..30477a41e 100644 --- a/i18n/de.i18n.json +++ b/i18n/de.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/el.i18n.json b/i18n/el.i18n.json index a7d93c2c6..fea520b81 100644 --- a/i18n/el.i18n.json +++ b/i18n/el.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/en-GB.i18n.json b/i18n/en-GB.i18n.json index 08f562368..ee99c9abf 100644 --- a/i18n/en-GB.i18n.json +++ b/i18n/en-GB.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/eo.i18n.json b/i18n/eo.i18n.json index 657a6370e..b4ebe6fa3 100644 --- a/i18n/eo.i18n.json +++ b/i18n/eo.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/es-AR.i18n.json b/i18n/es-AR.i18n.json index a46fac4ca..66e6106fc 100644 --- a/i18n/es-AR.i18n.json +++ b/i18n/es-AR.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/es-CL.i18n.json b/i18n/es-CL.i18n.json index b092c9fc3..9389c065c 100644 --- a/i18n/es-CL.i18n.json +++ b/i18n/es-CL.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/es-LA.i18n.json b/i18n/es-LA.i18n.json index 65b86284c..f127b1b7f 100644 --- a/i18n/es-LA.i18n.json +++ b/i18n/es-LA.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/es-MX.i18n.json b/i18n/es-MX.i18n.json index 0b6aee84e..a591acac9 100644 --- a/i18n/es-MX.i18n.json +++ b/i18n/es-MX.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/es-PE.i18n.json b/i18n/es-PE.i18n.json index 6eb38257f..6830127ac 100644 --- a/i18n/es-PE.i18n.json +++ b/i18n/es-PE.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/es-PY.i18n.json b/i18n/es-PY.i18n.json index 65b86284c..f127b1b7f 100644 --- a/i18n/es-PY.i18n.json +++ b/i18n/es-PY.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/es.i18n.json b/i18n/es.i18n.json index a8638e54e..1f280ae95 100644 --- a/i18n/es.i18n.json +++ b/i18n/es.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/eu.i18n.json b/i18n/eu.i18n.json index 91442e968..da99e89cb 100644 --- a/i18n/eu.i18n.json +++ b/i18n/eu.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/fa-IR.i18n.json b/i18n/fa-IR.i18n.json index 9c24a9f37..f509b7ab5 100644 --- a/i18n/fa-IR.i18n.json +++ b/i18n/fa-IR.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/fa.i18n.json b/i18n/fa.i18n.json index 7325b24a6..f12b64a60 100644 --- a/i18n/fa.i18n.json +++ b/i18n/fa.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/fi.i18n.json b/i18n/fi.i18n.json index 8f50ffcf6..d8a9f4f24 100644 --- a/i18n/fi.i18n.json +++ b/i18n/fi.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Kuutio odotus pyörijä", "Cube-Grid": "Kuutio ristikko odotus pyörijä", "Dot": "Piste odotus pyörijä", + "Double-Bounce": "Tupla pomppu odotus pyörijä", "Rotateplane": "Pyöritä tasoa odotus pyörijä", "Scaleout": "Skaalaus ulos odotus pyörijä", "Wave": "Aalto odotus pyörijä" diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json index d9b062a65..0f3f7286f 100644 --- a/i18n/fr.i18n.json +++ b/i18n/fr.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/gl.i18n.json b/i18n/gl.i18n.json index d13a8cce8..089218f06 100644 --- a/i18n/gl.i18n.json +++ b/i18n/gl.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/he.i18n.json b/i18n/he.i18n.json index ef69ac271..456fb22ee 100644 --- a/i18n/he.i18n.json +++ b/i18n/he.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/hi.i18n.json b/i18n/hi.i18n.json index 00d63be4b..ce49b30e3 100644 --- a/i18n/hi.i18n.json +++ b/i18n/hi.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/hr.i18n.json b/i18n/hr.i18n.json index 2f224c4df..cb498fc67 100644 --- a/i18n/hr.i18n.json +++ b/i18n/hr.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/hu.i18n.json b/i18n/hu.i18n.json index b8e59ecad..55856d7dc 100644 --- a/i18n/hu.i18n.json +++ b/i18n/hu.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/hy.i18n.json b/i18n/hy.i18n.json index dc9ada112..f71c2d090 100644 --- a/i18n/hy.i18n.json +++ b/i18n/hy.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/id.i18n.json b/i18n/id.i18n.json index f06861ac6..e9e3b112d 100644 --- a/i18n/id.i18n.json +++ b/i18n/id.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/ig.i18n.json b/i18n/ig.i18n.json index 9d53a57e8..0081b565d 100644 --- a/i18n/ig.i18n.json +++ b/i18n/ig.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json index 11c7b4747..72995504a 100644 --- a/i18n/it.i18n.json +++ b/i18n/it.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/ja.i18n.json b/i18n/ja.i18n.json index 24f3c8637..fbb398ab3 100644 --- a/i18n/ja.i18n.json +++ b/i18n/ja.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/ka.i18n.json b/i18n/ka.i18n.json index 86721c63c..aaa4cddba 100644 --- a/i18n/ka.i18n.json +++ b/i18n/ka.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/km.i18n.json b/i18n/km.i18n.json index ad3830bbc..a397aeea8 100644 --- a/i18n/km.i18n.json +++ b/i18n/km.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/ko.i18n.json b/i18n/ko.i18n.json index 488420240..b39ec0e85 100644 --- a/i18n/ko.i18n.json +++ b/i18n/ko.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/lt.i18n.json b/i18n/lt.i18n.json index 65b86284c..f127b1b7f 100644 --- a/i18n/lt.i18n.json +++ b/i18n/lt.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/lv.i18n.json b/i18n/lv.i18n.json index 7ae0eea80..8801d1a7e 100644 --- a/i18n/lv.i18n.json +++ b/i18n/lv.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/mk.i18n.json b/i18n/mk.i18n.json index d7cf599a9..01ea71d42 100644 --- a/i18n/mk.i18n.json +++ b/i18n/mk.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/mn.i18n.json b/i18n/mn.i18n.json index 4df3ad83a..5cea7507b 100644 --- a/i18n/mn.i18n.json +++ b/i18n/mn.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/nb.i18n.json b/i18n/nb.i18n.json index 2b97fa14f..031a96a0f 100644 --- a/i18n/nb.i18n.json +++ b/i18n/nb.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/nl.i18n.json b/i18n/nl.i18n.json index 9c04748a7..91d208aa8 100644 --- a/i18n/nl.i18n.json +++ b/i18n/nl.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/oc.i18n.json b/i18n/oc.i18n.json index 568a0212f..019ee93a7 100644 --- a/i18n/oc.i18n.json +++ b/i18n/oc.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/pa.i18n.json b/i18n/pa.i18n.json index 65b86284c..f127b1b7f 100644 --- a/i18n/pa.i18n.json +++ b/i18n/pa.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/pl.i18n.json b/i18n/pl.i18n.json index 496170389..7acc87171 100644 --- a/i18n/pl.i18n.json +++ b/i18n/pl.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/pt-BR.i18n.json b/i18n/pt-BR.i18n.json index 55748897f..22ceee9f2 100644 --- a/i18n/pt-BR.i18n.json +++ b/i18n/pt-BR.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/pt.i18n.json b/i18n/pt.i18n.json index 615056d8b..387cde4ae 100644 --- a/i18n/pt.i18n.json +++ b/i18n/pt.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/ro.i18n.json b/i18n/ro.i18n.json index f4f166f8e..285f242ba 100644 --- a/i18n/ro.i18n.json +++ b/i18n/ro.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/ru.i18n.json b/i18n/ru.i18n.json index 4f5bd0ae8..96cd90e95 100644 --- a/i18n/ru.i18n.json +++ b/i18n/ru.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/sk.i18n.json b/i18n/sk.i18n.json index 3d2294d75..2207c5361 100644 --- a/i18n/sk.i18n.json +++ b/i18n/sk.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/sl.i18n.json b/i18n/sl.i18n.json index dfbec3eb6..0d15845a1 100644 --- a/i18n/sl.i18n.json +++ b/i18n/sl.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/sr.i18n.json b/i18n/sr.i18n.json index 5f42babb0..d2f44c225 100644 --- a/i18n/sr.i18n.json +++ b/i18n/sr.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/sv.i18n.json b/i18n/sv.i18n.json index 1e2257c8d..ec952c25e 100644 --- a/i18n/sv.i18n.json +++ b/i18n/sv.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/sw.i18n.json b/i18n/sw.i18n.json index 7f0557f0e..44f4b836d 100644 --- a/i18n/sw.i18n.json +++ b/i18n/sw.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/ta.i18n.json b/i18n/ta.i18n.json index 1cf37bb2b..04a4d4864 100644 --- a/i18n/ta.i18n.json +++ b/i18n/ta.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/th.i18n.json b/i18n/th.i18n.json index d17069898..95aa34113 100644 --- a/i18n/th.i18n.json +++ b/i18n/th.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/tr.i18n.json b/i18n/tr.i18n.json index d3ecbaec3..3bd92813a 100644 --- a/i18n/tr.i18n.json +++ b/i18n/tr.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/uk.i18n.json b/i18n/uk.i18n.json index 1d8846f4d..e2c969923 100644 --- a/i18n/uk.i18n.json +++ b/i18n/uk.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/vi.i18n.json b/i18n/vi.i18n.json index 286cb8623..96a852431 100644 --- a/i18n/vi.i18n.json +++ b/i18n/vi.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/zh-CN.i18n.json b/i18n/zh-CN.i18n.json index b70ed902a..ab46668fc 100644 --- a/i18n/zh-CN.i18n.json +++ b/i18n/zh-CN.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/zh-HK.i18n.json b/i18n/zh-HK.i18n.json index 123c28d79..e91e35e88 100644 --- a/i18n/zh-HK.i18n.json +++ b/i18n/zh-HK.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" diff --git a/i18n/zh-TW.i18n.json b/i18n/zh-TW.i18n.json index 88587970d..c95cd0a8b 100644 --- a/i18n/zh-TW.i18n.json +++ b/i18n/zh-TW.i18n.json @@ -1044,6 +1044,7 @@ "Cube": "Cube Wait Spinner", "Cube-Grid": "Cube-Grid Wait Spinner", "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" From b9a15e68dee740024187b3534f9fbd574564e08b Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 12 Jun 2021 08:53:19 +0300 Subject: [PATCH 58/81] Updated translations. --- i18n/de.i18n.json | 16 ++++++++-------- i18n/ru.i18n.json | 14 +++++++------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json index 30477a41e..a4eb8b47e 100644 --- a/i18n/de.i18n.json +++ b/i18n/de.i18n.json @@ -1040,12 +1040,12 @@ "copySwimlanePopup-title": "Swimlane kopieren", "display-card-creator": "Karten-Ersteller anzeigen", "wait-spinner": "Warte-Symbol", - "Bounce": "Bounce Wait Spinner", - "Cube": "Cube Wait Spinner", - "Cube-Grid": "Cube-Grid Wait Spinner", - "Dot": "Dot Wait Spinner", - "Double-Bounce": "Double Bounce Wait Spinner", - "Rotateplane": "Rotateplane Wait Spinner", - "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Bounce": "Puls-Warte-Symbol", + "Cube": "Würfel-Warte-Symbol", + "Cube-Grid": "Würfel-Gitter-Warte-Symbol", + "Dot": "Punkt-Warte-Symbol", + "Double-Bounce": "Doppelpuls-Warte-Symbol", + "Rotateplane": "Drehscheibe-Warte-Symbol", + "Scaleout": "Scaleout-Warte-Symbol", + "Wave": "Wellen-Warte-Symbol" } \ No newline at end of file diff --git a/i18n/ru.i18n.json b/i18n/ru.i18n.json index 96cd90e95..3aaff6f2d 100644 --- a/i18n/ru.i18n.json +++ b/i18n/ru.i18n.json @@ -664,7 +664,7 @@ "setListColorPopup-title": "Выберите цвет", "assigned-by": "Поручил", "requested-by": "Запросил", - "card-sorting-by-number": "Card sorting by number", + "card-sorting-by-number": "Сортировка карточек по номеру", "board-delete-notice": "Удаление является постоянным. Вы потеряете все списки, карты и действия, связанные с этой доской.", "delete-board-confirm-popup": "Все списки, карточки, метки и действия будут удалены, и вы не сможете восстановить содержимое доски. Отменить нельзя.", "boardDeletePopup-title": "Удалить доску?", @@ -1039,12 +1039,12 @@ "copy-swimlane": "Скопировать дорожку", "copySwimlanePopup-title": "Скопировать дорожку", "display-card-creator": "Показать создателя карты", - "wait-spinner": "Wait Spinner", - "Bounce": "Bounce Wait Spinner", - "Cube": "Cube Wait Spinner", - "Cube-Grid": "Cube-Grid Wait Spinner", - "Dot": "Dot Wait Spinner", - "Double-Bounce": "Double Bounce Wait Spinner", + "wait-spinner": "Спинер ожидания", + "Bounce": "Прыгающий спинер ожидания", + "Cube": "Кубический спинер ожидания", + "Cube-Grid": "Сетка кубиков", + "Dot": "Точки", + "Double-Bounce": "Двойной прыгающий спинер ожидания", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner" From 2e1eb1e224c83f16a384316626d7a4183639d4cd Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 12 Jun 2021 12:46:30 +0300 Subject: [PATCH 59/81] Add border and update label colors for better visibility. Thanks to xet7 ! --- client/components/cards/labels.styl | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/client/components/cards/labels.styl b/client/components/cards/labels.styl index ee9466567..0e192e59f 100644 --- a/client/components/cards/labels.styl +++ b/client/components/cards/labels.styl @@ -44,9 +44,20 @@ align-items: center justify-content: center +.card-label-white + background-color: #ffffff + color: #000000 //Black text for better visibility + border: 1px solid #c0c0c0 + +.card-label-white:hover + color: #aaaaaa //grey text for better visibility + .card-label-green background-color: #3cb500 +.card-label-green:hover + color: #000000 //Black hover text for better visibility + .card-label-yellow background-color: #fad900 color: #000000 //Black text for better visibility From 8c572502436a2eb22bd1eb1e4069c1c9145e2070 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 12 Jun 2021 12:48:12 +0300 Subject: [PATCH 60/81] Maximize Card. In Progress. Thanks to xet7 ! Related #1574 --- client/components/cards/cardDetails.jade | 923 ++++++++++++----------- client/components/cards/cardDetails.js | 12 + client/components/cards/cardDetails.styl | 85 ++- i18n/en.i18n.json | 4 +- models/users.js | 26 +- 5 files changed, 573 insertions(+), 477 deletions(-) diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade index acde82a54..66bf708fd 100644 --- a/client/components/cards/cardDetails.jade +++ b/client/components/cards/cardDetails.jade @@ -6,6 +6,10 @@ template(name="cardDetails") else unless isMiniScreen a.fa.fa-times-thin.close-card-details.js-close-card-details(title="{{_ 'close-card'}}") + unless cardMaximized + a.fa.fa-window-maximize.maximize-card-details.js-maximize-card-details(title="{{_ 'maximize-card'}}") + if cardMaximized + a.fa.fa-window-minimize.minimize-card-details.js-minimize-card-details(title="{{_ 'minimize-card'}}") if currentUser.isBoardMember a.fa.fa-navicon.card-details-menu.js-open-card-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}") input.inline-input(type="text" id="cardURL_copy" value="{{ originRelativeUrl }}") @@ -41,498 +45,501 @@ template(name="cardDetails") else p.warning {{_ 'card-archived'}} - .card-details-items - if currentBoard.allowsLabels - .card-details-item.card-details-item-labels - h3.card-details-item-title - i.fa.fa-tags - | {{_ 'labels'}} - a(class="{{#if canModifyCard}}js-add-labels{{else}}is-disabled{{/if}}" title="{{_ 'card-labels-title'}}") - each labels - span.card-label(class="card-label-{{color}}" title=name) - +viewer - = name - if canModifyCard - unless currentUser.isWorker - a.card-label.add-label.js-add-labels(title="{{_ 'card-labels-title'}}") - i.fa.fa-plus + .card-details-left + + .card-details-items + if currentBoard.allowsLabels + .card-details-item.card-details-item-labels + h3.card-details-item-title + i.fa.fa-tags + | {{_ 'labels'}} + a(class="{{#if canModifyCard}}js-add-labels{{else}}is-disabled{{/if}}" title="{{_ 'card-labels-title'}}") + each labels + span.card-label(class="card-label-{{color}}" title=name) + +viewer + = name + if canModifyCard + unless currentUser.isWorker + a.card-label.add-label.js-add-labels(title="{{_ 'card-labels-title'}}") + i.fa.fa-plus + + if currentBoard.allowsReceivedDate + hr + .card-details-item.card-details-item-received + h3.card-details-item-title + i.fa.fa-sign-out + | {{_ 'card-received'}} + if getReceived + +cardReceivedDate + else + if canModifyCard + unless currentUser.isWorker + a.card-label.add-label.js-received-date + i.fa.fa-plus + + if currentBoard.allowsStartDate + .card-details-item.card-details-item-start + h3.card-details-item-title + i.fa.fa-hourglass-start + | {{_ 'card-start'}} + if getStart + +cardStartDate + else + if canModifyCard + unless currentUser.isWorker + a.card-label.add-label.js-start-date + i.fa.fa-plus + + if currentBoard.allowsDueDate + .card-details-item.card-details-item-due + h3.card-details-item-title + i.fa.fa-sign-in + | {{_ 'card-due'}} + if getDue + +cardDueDate + else + if canModifyCard + unless currentUser.isWorker + a.card-label.add-label.js-due-date + i.fa.fa-plus + + if currentBoard.allowsEndDate + .card-details-item.card-details-item-end + h3.card-details-item-title + i.fa.fa-hourglass-end + | {{_ 'card-end'}} + if getEnd + +cardEndDate + else + if canModifyCard + unless currentUser.isWorker + a.card-label.add-label.js-end-date + i.fa.fa-plus - if currentBoard.allowsReceivedDate hr - .card-details-item.card-details-item-received - h3.card-details-item-title - i.fa.fa-sign-out - | {{_ 'card-received'}} - if getReceived - +cardReceivedDate - else - if canModifyCard - unless currentUser.isWorker - a.card-label.add-label.js-received-date - i.fa.fa-plus + if currentBoard.allowsCreator + .card-details-item.card-details-item-creator + h3.card-details-item-title + i.fa.fa-user + | {{_ 'creator'}} - if currentBoard.allowsStartDate - .card-details-item.card-details-item-start - h3.card-details-item-title - i.fa.fa-hourglass-start - | {{_ 'card-start'}} - if getStart - +cardStartDate - else - if canModifyCard - unless currentUser.isWorker - a.card-label.add-label.js-start-date - i.fa.fa-plus - - if currentBoard.allowsDueDate - .card-details-item.card-details-item-due - h3.card-details-item-title - i.fa.fa-sign-in - | {{_ 'card-due'}} - if getDue - +cardDueDate - else - if canModifyCard - unless currentUser.isWorker - a.card-label.add-label.js-due-date - i.fa.fa-plus - - if currentBoard.allowsEndDate - .card-details-item.card-details-item-end - h3.card-details-item-title - i.fa.fa-hourglass-end - | {{_ 'card-end'}} - if getEnd - +cardEndDate - else - if canModifyCard - unless currentUser.isWorker - a.card-label.add-label.js-end-date - i.fa.fa-plus - - hr - if currentBoard.allowsCreator - .card-details-item.card-details-item-creator - h3.card-details-item-title - i.fa.fa-user - | {{_ 'creator'}} - - +userAvatar(userId=userId noRemove=true) - | {{! XXX Hack to hide syntaxic coloration /// }} - - //.card-details-items - if currentBoard.allowsMembers - .card-details-item.card-details-item-members - h3.card-details-item-title - i.fa.fa-users - | {{_ 'members'}} - each userId in getMembers - +userAvatar(userId=userId cardId=_id) + +userAvatar(userId=userId noRemove=true) | {{! XXX Hack to hide syntaxic coloration /// }} - if canModifyCard - unless currentUser.isWorker - a.member.add-member.card-details-item-add-button.js-add-members(title="{{_ 'card-members-title'}}") - i.fa.fa-plus - //if assigneeSelected - if currentBoard.allowsAssignee - .card-details-item.card-details-item-assignees - h3.card-details-item-title - i.fa.fa-user - | {{_ 'assignee'}} - each userId in getAssignees - +userAvatar(userId=userId cardId=_id assignee=true) - | {{! XXX Hack to hide syntaxic coloration /// }} - if canModifyCard - a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}") - i.fa.fa-plus - if currentUser.isWorker - unless assigneeSelected + //.card-details-items + if currentBoard.allowsMembers + .card-details-item.card-details-item-members + h3.card-details-item-title + i.fa.fa-users + | {{_ 'members'}} + each userId in getMembers + +userAvatar(userId=userId cardId=_id) + | {{! XXX Hack to hide syntaxic coloration /// }} + if canModifyCard + unless currentUser.isWorker + a.member.add-member.card-details-item-add-button.js-add-members(title="{{_ 'card-members-title'}}") + i.fa.fa-plus + + //if assigneeSelected + if currentBoard.allowsAssignee + .card-details-item.card-details-item-assignees + h3.card-details-item-title + i.fa.fa-user + | {{_ 'assignee'}} + each userId in getAssignees + +userAvatar(userId=userId cardId=_id assignee=true) + | {{! XXX Hack to hide syntaxic coloration /// }} + if canModifyCard a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}") i.fa.fa-plus + if currentUser.isWorker + unless assigneeSelected + a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}") + i.fa.fa-plus - //.card-details-items - if getSpentTime - .card-details-item.card-details-item-spent - if getIsOvertime - h3.card-details-item-title - | {{_ 'overtime-hours'}} - else - h3.card-details-item-title - | {{_ 'spent-time-hours'}} - +cardSpentTime - - //.card-details-items - if currentBoard.allowsRequestedBy - .card-details-item.card-details-item-name - h3.card-details-item-title - i.fa.fa-shopping-cart - | {{_ 'requested-by'}} - if canModifyCard - unless currentUser.isWorker - +inlinedForm(classNames="js-card-details-requester") - +editCardRequesterForm - else - a.js-open-inlined-form - if getRequestedBy - +viewer - = getRequestedBy - else - | {{_ 'add'}} - else if getRequestedBy - +viewer - = getRequestedBy - - if currentBoard.allowsAssignedBy - .card-details-item.card-details-item-name - h3.card-details-item-title - i.fa.fa-user-plus - | {{_ 'assigned-by'}} - if canModifyCard - unless currentUser.isWorker - +inlinedForm(classNames="js-card-details-assigner") - +editCardAssignerForm - else - a.js-open-inlined-form - if getAssignedBy - +viewer - = getAssignedBy - else - | {{_ 'add'}} - else if getRequestedBy - +viewer - = getAssignedBy - - if currentBoard.allowsCardSortingByNumber - .card-details-item.card-details-sort-order - h3.card-details-item-title - i.fa.fa-sort - | {{_ 'sort'}} - if canModifyCard - +inlinedForm(classNames="js-card-details-sort") - +editCardSortOrderForm + //.card-details-items + if getSpentTime + .card-details-item.card-details-item-spent + if getIsOvertime + h3.card-details-item-title + | {{_ 'overtime-hours'}} else - a.js-open-inlined-form - +viewer - = sort + h3.card-details-item-title + | {{_ 'spent-time-hours'}} + +cardSpentTime - //.card-details-items - if customFieldsWD - hr - each customFieldsWD - .card-details-item.card-details-item-customfield + //.card-details-items + if currentBoard.allowsRequestedBy + .card-details-item.card-details-item-name h3.card-details-item-title - i.fa.fa-list-alt - = definition.name - +cardCustomField + i.fa.fa-shopping-cart + | {{_ 'requested-by'}} + if canModifyCard + unless currentUser.isWorker + +inlinedForm(classNames="js-card-details-requester") + +editCardRequesterForm + else + a.js-open-inlined-form + if getRequestedBy + +viewer + = getRequestedBy + else + | {{_ 'add'}} + else if getRequestedBy + +viewer + = getRequestedBy - if getVoteQuestion - hr - .vote-title - div.flex - h3 - i.fa.fa-thumbs-up - | {{_ 'vote-question'}} - if getVoteEnd - +voteEndDate - .vote-result - if votePublic - a.card-label.card-label-green.js-show-positive-votes {{ voteCountPositive }} - a.card-label.card-label-red.js-show-negative-votes {{ voteCountNegative }} - else - .card-label.card-label-green {{ voteCountPositive }} - .card-label.card-label-red {{ voteCountNegative }} - unless ($and currentBoard.isPublic voteAllowNonBoardMembers ) - .card-label.card-label-gray {{ voteCount }} {{_ 'r-of' }} {{ currentBoard.activeMembers.length }} - +viewer - = getVoteQuestion - if showVotingButtons - button.card-details-green.js-vote.js-vote-positive(class="{{#if voteState}}voted{{/if}}") - if voteState - i.fa.fa-thumbs-up - | {{_ 'vote-for-it'}} - button.card-details-red.js-vote.js-vote-negative(class="{{#if $eq voteState false}}voted{{/if}}") - if $eq voteState false - i.fa.fa-thumbs-down - | {{_ 'vote-against'}} + if currentBoard.allowsAssignedBy + .card-details-item.card-details-item-name + h3.card-details-item-title + i.fa.fa-user-plus + | {{_ 'assigned-by'}} + if canModifyCard + unless currentUser.isWorker + +inlinedForm(classNames="js-card-details-assigner") + +editCardAssignerForm + else + a.js-open-inlined-form + if getAssignedBy + +viewer + = getAssignedBy + else + | {{_ 'add'}} + else if getRequestedBy + +viewer + = getAssignedBy - if getPokerQuestion - hr - .poker-title - div.flex - h3 - i.fa.fa-thumbs-up - | {{_ 'poker-question'}} - if getPokerEnd - +pokerEndDate - div.flex + if currentBoard.allowsCardSortingByNumber + .card-details-item.card-details-sort-order + h3.card-details-item-title + i.fa.fa-sort + | {{_ 'sort'}} + if canModifyCard + +inlinedForm(classNames="js-card-details-sort") + +editCardSortOrderForm + else + a.js-open-inlined-form + +viewer + = sort + + //.card-details-items + if customFieldsWD + hr + each customFieldsWD + .card-details-item.card-details-item-customfield + h3.card-details-item-title + i.fa.fa-list-alt + = definition.name + +cardCustomField + + if getVoteQuestion + hr + .vote-title + div.flex + h3 + i.fa.fa-thumbs-up + | {{_ 'vote-question'}} + if getVoteEnd + +voteEndDate + .vote-result + if votePublic + a.card-label.card-label-green.js-show-positive-votes {{ voteCountPositive }} + a.card-label.card-label-red.js-show-negative-votes {{ voteCountNegative }} + else + .card-label.card-label-green {{ voteCountPositive }} + .card-label.card-label-red {{ voteCountNegative }} + unless ($and currentBoard.isPublic voteAllowNonBoardMembers ) + .card-label.card-label-gray {{ voteCount }} {{_ 'r-of' }} {{ currentBoard.activeMembers.length }} + +viewer + = getVoteQuestion + if showVotingButtons + button.card-details-green.js-vote.js-vote-positive(class="{{#if voteState}}voted{{/if}}") + if voteState + i.fa.fa-thumbs-up + | {{_ 'vote-for-it'}} + button.card-details-red.js-vote.js-vote-negative(class="{{#if $eq voteState false}}voted{{/if}}") + if $eq voteState false + i.fa.fa-thumbs-down + | {{_ 'vote-against'}} + + if getPokerQuestion + hr + .poker-title + div.flex + h3 + i.fa.fa-thumbs-up + | {{_ 'poker-question'}} + if getPokerEnd + +pokerEndDate + div.flex + .poker-result + if expiredPoker + unless ($and currentBoard.isPublic pokerAllowNonBoardMembers ) + .card-label.card-label-gray {{ pokerCount }} {{_ 'r-of' }} {{ currentBoard.activeMembers.length }} + if showPlanningPokerButtons .poker-result - if expiredPoker - unless ($and currentBoard.isPublic pokerAllowNonBoardMembers ) - .card-label.card-label-gray {{ pokerCount }} {{_ 'r-of' }} {{ currentBoard.activeMembers.length }} - if showPlanningPokerButtons - .poker-result - .poker-deck - .poker-card - span.inner.js-poker.js-poker-vote-one(class="{{#if $eq pokerState 'one'}}poker-voted{{/if}}") {{_ 'poker-one'}} - if $eq pokerState "one" - i.fa.fa-check - .poker-deck - .poker-card - span.inner.js-poker.js-poker-vote-two(class="{{#if $eq pokerState 'two'}}poker-voted{{/if}}") {{_ 'poker-two'}} - if $eq pokerState "two" - i.fa.fa-check - .poker-deck - .poker-card - span.inner.js-poker.js-poker-vote-three(class="{{#if $eq pokerState 'three'}}poker-voted{{/if}}") {{_ 'poker-three'}} - if $eq pokerState "three" - i.fa.fa-check - .poker-deck - .poker-card - span.inner.js-poker.js-poker-vote-five(class="{{#if $eq pokerState 'five'}}poker-voted{{/if}}") {{_ 'poker-five'}} - if $eq pokerState "five" - i.fa.fa-check - .poker-deck - .poker-card - span.inner.js-poker.js-poker-vote-eight(class="{{#if $eq pokerState 'eight'}}poker-voted{{/if}}") {{_ 'poker-eight'}} - if $eq pokerState "eight" - i.fa.fa-check - .poker-deck - .poker-card - span.inner.js-poker.js-poker-vote-thirteen(class="{{#if $eq pokerState 'thirteen'}}poker-voted{{/if}}") {{_ 'poker-thirteen'}} - if $eq pokerState "thirteen" - i.fa.fa-check - .poker-deck - .poker-card - span.inner.js-poker.js-poker-vote-twenty(class="{{#if $eq pokerState 'twenty'}}poker-voted{{/if}}") {{_ 'poker-twenty'}} - if $eq pokerState "twenty" - i.fa.fa-check - .poker-deck - .poker-card - span.inner.js-poker.js-poker-vote-forty(class="{{#if $eq pokerState 'forty'}}poker-voted{{/if}}") {{_ 'poker-forty'}} - if $eq pokerState "forty" - i.fa.fa-check - .poker-deck - .poker-card - span.inner.js-poker.js-poker-vote-one-hundred(class="{{#if $eq pokerState 'oneHundred'}}poker-voted{{/if}}") {{_ 'poker-oneHundred'}} - if $eq pokerState "oneHundred" - i.fa.fa-check - .poker-deck - .poker-card - span.inner.js-poker.js-poker-vote-unsure(class="{{#if $eq pokerState 'unsure'}}poker-voted{{/if}}") {{_ 'poker-unsure'}} - if $eq pokerState "unsure" - i.fa.fa-check + .poker-deck + .poker-card + span.inner.js-poker.js-poker-vote-one(class="{{#if $eq pokerState 'one'}}poker-voted{{/if}}") {{_ 'poker-one'}} + if $eq pokerState "one" + i.fa.fa-check + .poker-deck + .poker-card + span.inner.js-poker.js-poker-vote-two(class="{{#if $eq pokerState 'two'}}poker-voted{{/if}}") {{_ 'poker-two'}} + if $eq pokerState "two" + i.fa.fa-check + .poker-deck + .poker-card + span.inner.js-poker.js-poker-vote-three(class="{{#if $eq pokerState 'three'}}poker-voted{{/if}}") {{_ 'poker-three'}} + if $eq pokerState "three" + i.fa.fa-check + .poker-deck + .poker-card + span.inner.js-poker.js-poker-vote-five(class="{{#if $eq pokerState 'five'}}poker-voted{{/if}}") {{_ 'poker-five'}} + if $eq pokerState "five" + i.fa.fa-check + .poker-deck + .poker-card + span.inner.js-poker.js-poker-vote-eight(class="{{#if $eq pokerState 'eight'}}poker-voted{{/if}}") {{_ 'poker-eight'}} + if $eq pokerState "eight" + i.fa.fa-check + .poker-deck + .poker-card + span.inner.js-poker.js-poker-vote-thirteen(class="{{#if $eq pokerState 'thirteen'}}poker-voted{{/if}}") {{_ 'poker-thirteen'}} + if $eq pokerState "thirteen" + i.fa.fa-check + .poker-deck + .poker-card + span.inner.js-poker.js-poker-vote-twenty(class="{{#if $eq pokerState 'twenty'}}poker-voted{{/if}}") {{_ 'poker-twenty'}} + if $eq pokerState "twenty" + i.fa.fa-check + .poker-deck + .poker-card + span.inner.js-poker.js-poker-vote-forty(class="{{#if $eq pokerState 'forty'}}poker-voted{{/if}}") {{_ 'poker-forty'}} + if $eq pokerState "forty" + i.fa.fa-check + .poker-deck + .poker-card + span.inner.js-poker.js-poker-vote-one-hundred(class="{{#if $eq pokerState 'oneHundred'}}poker-voted{{/if}}") {{_ 'poker-oneHundred'}} + if $eq pokerState "oneHundred" + i.fa.fa-check + .poker-deck + .poker-card + span.inner.js-poker.js-poker-vote-unsure(class="{{#if $eq pokerState 'unsure'}}poker-voted{{/if}}") {{_ 'poker-unsure'}} + if $eq pokerState "unsure" + i.fa.fa-check - if currentUser.isBoardAdmin - button.card-details-blue.js-poker-finish(class="{{#if $eq voteState false}}poker-voted{{/if}}") {{_ 'poker-finish'}} + if currentUser.isBoardAdmin + button.card-details-blue.js-poker-finish(class="{{#if $eq voteState false}}poker-voted{{/if}}") {{_ 'poker-finish'}} - if expiredPoker - .poker-table - .poker-table-side-left - .poker-table-heading-left - .poker-table-row - .poker-table-cell - .poker-table-cell - | {{_ 'poker-result-votes' }} - .poker-table-cell.poker-table-cell-who - | {{_ 'poker-result-who' }} - .poker-table-body - .poker-table-row - .poker-table-cell - button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 1}}winner{{else}}loser{{/if}}") {{_ 'poker-one'}} - .poker-table-cell {{ pokerCountOne }} - .poker-table-cell.poker-table-cell-who - .poker-result - each m in pokerMemberOne - a.name - +userAvatar(userId=m._id noRemove=true) + if expiredPoker + .poker-table + .poker-table-side-left + .poker-table-heading-left + .poker-table-row + .poker-table-cell + .poker-table-cell + | {{_ 'poker-result-votes' }} + .poker-table-cell.poker-table-cell-who + | {{_ 'poker-result-who' }} + .poker-table-body + .poker-table-row + .poker-table-cell + button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 1}}winner{{else}}loser{{/if}}") {{_ 'poker-one'}} + .poker-table-cell {{ pokerCountOne }} + .poker-table-cell.poker-table-cell-who + .poker-result + each m in pokerMemberOne + a.name + +userAvatar(userId=m._id noRemove=true) - .poker-table-row - .poker-table-cell - button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 2}}winner{{else}}loser{{/if}}") {{_ 'poker-two'}} - .poker-table-cell {{ pokerCountTwo }} - .poker-table-cell.poker-table-cell-who - .poker-result - each m in pokerMemberTwo - a.name - +userAvatar(userId=m._id noRemove=true) + .poker-table-row + .poker-table-cell + button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 2}}winner{{else}}loser{{/if}}") {{_ 'poker-two'}} + .poker-table-cell {{ pokerCountTwo }} + .poker-table-cell.poker-table-cell-who + .poker-result + each m in pokerMemberTwo + a.name + +userAvatar(userId=m._id noRemove=true) - .poker-table-row - .poker-table-cell - button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 3}}winner{{else}}loser{{/if}}") {{_ 'poker-three'}} - .poker-table-cell {{ pokerCountThree }} - .poker-table-cell.poker-table-cell-who - .poker-result - each m in pokerMemberThree - a.name - +userAvatar(userId=m._id noRemove=true) + .poker-table-row + .poker-table-cell + button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 3}}winner{{else}}loser{{/if}}") {{_ 'poker-three'}} + .poker-table-cell {{ pokerCountThree }} + .poker-table-cell.poker-table-cell-who + .poker-result + each m in pokerMemberThree + a.name + +userAvatar(userId=m._id noRemove=true) - .poker-table-row - .poker-table-cell - button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 5}}winner{{else}}loser{{/if}}") {{_ 'poker-five'}} - .poker-table-cell {{ pokerCountFive }} - .poker-table-cell.poker-table-cell-who - .poker-result - each m in pokerMemberFive - a.name - +userAvatar(userId=m._id noRemove=true) + .poker-table-row + .poker-table-cell + button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 5}}winner{{else}}loser{{/if}}") {{_ 'poker-five'}} + .poker-table-cell {{ pokerCountFive }} + .poker-table-cell.poker-table-cell-who + .poker-result + each m in pokerMemberFive + a.name + +userAvatar(userId=m._id noRemove=true) - .poker-table-row - .poker-table-cell - button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 8}}winner{{else}}loser{{/if}}") {{_ 'poker-eight'}} - .poker-table-cell {{ pokerCountEight }} - .poker-table-cell.poker-table-cell-who - .poker-result - each m in pokerMemberEight - a.name - +userAvatar(userId=m._id noRemove=true) + .poker-table-row + .poker-table-cell + button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 8}}winner{{else}}loser{{/if}}") {{_ 'poker-eight'}} + .poker-table-cell {{ pokerCountEight }} + .poker-table-cell.poker-table-cell-who + .poker-result + each m in pokerMemberEight + a.name + +userAvatar(userId=m._id noRemove=true) - .poker-table-side-right - .poker-table-heading-right - .poker-table-row - .poker-table-cell - .poker-table-cell - | {{_ 'poker-result-votes' }} - .poker-table-cell.poker-table-cell-who - | {{_ 'poker-result-who' }} - .poker-table-body - .poker-table-row - .poker-table-cell - button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 13}}winner{{else}}loser{{/if}}") {{_ 'poker-thirteen'}} - .poker-table-cell {{ pokerCountThirteen }} - .poker-table-cell.poker-table-cell-who - .poker-result - each m in pokerMemberThirteen - a.name - +userAvatar(userId=m._id noRemove=true) + .poker-table-side-right + .poker-table-heading-right + .poker-table-row + .poker-table-cell + .poker-table-cell + | {{_ 'poker-result-votes' }} + .poker-table-cell.poker-table-cell-who + | {{_ 'poker-result-who' }} + .poker-table-body + .poker-table-row + .poker-table-cell + button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 13}}winner{{else}}loser{{/if}}") {{_ 'poker-thirteen'}} + .poker-table-cell {{ pokerCountThirteen }} + .poker-table-cell.poker-table-cell-who + .poker-result + each m in pokerMemberThirteen + a.name + +userAvatar(userId=m._id noRemove=true) - .poker-table-row - .poker-table-cell - button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 20}}winner{{else}}loser{{/if}}") {{_ 'poker-twenty'}} - .poker-table-cell {{ pokerCountTwenty }} - .poker-table-cell.poker-table-cell-who - .poker-result - each m in pokerMemberTwenty - a.name - +userAvatar(userId=m._id noRemove=true) + .poker-table-row + .poker-table-cell + button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 20}}winner{{else}}loser{{/if}}") {{_ 'poker-twenty'}} + .poker-table-cell {{ pokerCountTwenty }} + .poker-table-cell.poker-table-cell-who + .poker-result + each m in pokerMemberTwenty + a.name + +userAvatar(userId=m._id noRemove=true) - .poker-table-row - .poker-table-cell - button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 40}}winner{{else}}loser{{/if}}") {{_ 'poker-forty'}} - .poker-table-cell {{ pokerCountForty }} - .poker-table-cell.poker-table-cell-who - .poker-result - each m in pokerMemberForty - a.name - +userAvatar(userId=m._id noRemove=true) + .poker-table-row + .poker-table-cell + button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 40}}winner{{else}}loser{{/if}}") {{_ 'poker-forty'}} + .poker-table-cell {{ pokerCountForty }} + .poker-table-cell.poker-table-cell-who + .poker-result + each m in pokerMemberForty + a.name + +userAvatar(userId=m._id noRemove=true) - .poker-table-row - .poker-table-cell - button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 100}}winner{{else}}loser{{/if}}") {{_ 'poker-oneHundred'}} - .poker-table-cell {{ pokerCountOneHundred }} - .poker-table-cell.poker-table-cell-who - .poker-result - each m in pokerMemberOneHundred - a.name - +userAvatar(userId=m._id noRemove=true) + .poker-table-row + .poker-table-cell + button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 100}}winner{{else}}loser{{/if}}") {{_ 'poker-oneHundred'}} + .poker-table-cell {{ pokerCountOneHundred }} + .poker-table-cell.poker-table-cell-who + .poker-result + each m in pokerMemberOneHundred + a.name + +userAvatar(userId=m._id noRemove=true) - .poker-table-row - .poker-table-cell - button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 'unsure'}}winner{{else}}loser{{/if}}") {{_ 'poker-unsure'}} - .poker-table-cell {{ pokerCountUnsure }} - .poker-table-cell.poker-table-cell-who - .poker-result - each m in pokerMemberUnsure - a.name - +userAvatar(userId=m._id noRemove=true) + .poker-table-row + .poker-table-cell + button.card-details-gray.js-poker.poker-card-result(class="{{#if $eq pokerWinner 'unsure'}}winner{{else}}loser{{/if}}") {{_ 'poker-unsure'}} + .poker-table-cell {{ pokerCountUnsure }} + .poker-table-cell.poker-table-cell-who + .poker-result + each m in pokerMemberUnsure + a.name + +userAvatar(userId=m._id noRemove=true) - if currentUser.isBoardAdmin - div.estimation-add - button.card-details-red.js-poker-replay(class="{{#if $eq voteState false}}voted{{/if}}") {{_ 'poker-replay'}} - div.estimation-add - button.js-poker-estimation - i.fa.fa-plus - | {{_ 'set-estimation'}} - input(type=text,autofocus value=getPokerEstimation,id="pokerEstimation") + if currentUser.isBoardAdmin + div.estimation-add + button.card-details-red.js-poker-replay(class="{{#if $eq voteState false}}voted{{/if}}") {{_ 'poker-replay'}} + div.estimation-add + button.js-poker-estimation + i.fa.fa-plus + | {{_ 'set-estimation'}} + input(type=text,autofocus value=getPokerEstimation,id="pokerEstimation") - //- XXX We should use "editable" to avoid repetiting ourselves - if canModifyCard - unless currentUser.isWorker + //- XXX We should use "editable" to avoid repetiting ourselves + if canModifyCard + unless currentUser.isWorker + if currentBoard.allowsDescriptionTitle + hr + h3.card-details-item-title + i.fa.fa-align-left + | {{_ 'description'}} + if currentBoard.allowsDescriptionText + +inlinedCardDescription(classNames="card-description js-card-description") + +descriptionForm + .edit-controls.clearfix + button.primary(type="submit") {{_ 'save'}} + a.fa.fa-times-thin.js-close-inlined-form + else + if currentBoard.allowsDescriptionText + a.js-open-inlined-form + if getDescription + +viewer + = getDescription + else + | {{_ 'edit'}} + if (hasUnsavedValue 'cardDescription' _id) + p.quiet + | {{_ 'unsaved-description'}} + a.js-open-inlined-form {{_ 'view-it'}} + = ' - ' + a.js-close-inlined-form {{_ 'discard'}} + else if getDescription if currentBoard.allowsDescriptionTitle hr - h3.card-details-item-title - i.fa.fa-align-left - | {{_ 'description'}} + h3.card-details-item-title {{_ 'description'}} if currentBoard.allowsDescriptionText - +inlinedCardDescription(classNames="card-description js-card-description") - +descriptionForm - .edit-controls.clearfix - button.primary(type="submit") {{_ 'save'}} - a.fa.fa-times-thin.js-close-inlined-form - else - if currentBoard.allowsDescriptionText - a.js-open-inlined-form - if getDescription - +viewer - = getDescription - else - | {{_ 'edit'}} - if (hasUnsavedValue 'cardDescription' _id) - p.quiet - | {{_ 'unsaved-description'}} - a.js-open-inlined-form {{_ 'view-it'}} - = ' - ' - a.js-close-inlined-form {{_ 'discard'}} - else if getDescription - if currentBoard.allowsDescriptionTitle - hr - h3.card-details-item-title {{_ 'description'}} - if currentBoard.allowsDescriptionText - +viewer - = getDescription + +viewer + = getDescription - .card-checklist-attachmentGalerys - .card-checklist-attachmentGalery.card-checklists - if currentBoard.allowsChecklists + .card-checklist-attachmentGalerys + .card-checklist-attachmentGalery.card-checklists + if currentBoard.allowsChecklists + hr + +checklists(cardId = _id) + if currentBoard.allowsSubtasks + hr + +subtasks(cardId = _id) + if currentBoard.allowsAttachments hr - +checklists(cardId = _id) - if currentBoard.allowsSubtasks - hr - +subtasks(cardId = _id) - if currentBoard.allowsAttachments - hr - h3.card-details-item-title - i.fa.fa-paperclip - | {{_ 'attachments'}} - .card-checklist-attachmentGalery.card-attachmentGalery - +attachmentsGalery + h3.card-details-item-title + i.fa.fa-paperclip + | {{_ 'attachments'}} + .card-checklist-attachmentGalery.card-attachmentGalery + +attachmentsGalery - hr - unless currentUser.isNoComments - .activity-title - h3.card-details-item-title - i.fa.fa-history - | {{ _ 'activity'}} + .card-details-right + + unless currentUser.isNoComments + .activity-title + h3.card-details-item-title + i.fa.fa-history + | {{ _ 'activity'}} + if currentUser.isBoardMember + .material-toggle-switch(title="{{_ 'hide-system-messages'}}") + //span.toggle-switch-title + if hiddenSystemMessages + input.toggle-switch(type="checkbox" id="toggleButton" checked="checked") + else + input.toggle-switch(type="checkbox" id="toggleButton") + label.toggle-label(for="toggleButton") + if currentBoard.allowsComments if currentUser.isBoardMember - .material-toggle-switch(title="{{_ 'hide-system-messages'}}") - //span.toggle-switch-title - if hiddenSystemMessages - input.toggle-switch(type="checkbox" id="toggleButton" checked="checked") - else - input.toggle-switch(type="checkbox" id="toggleButton") - label.toggle-label(for="toggleButton") - if currentBoard.allowsComments - if currentUser.isBoardMember - unless currentUser.isNoComments - +commentForm - unless currentUser.isNoComments - if isLoaded.get - if isLinkedCard - +activities(card=this mode="linkedcard") - else if isLinkedBoard - +activities(card=this mode="linkedboard") - else - +activities(card=this mode="card") + unless currentUser.isNoComments + +commentForm + unless currentUser.isNoComments + if isLoaded.get + if isLinkedCard + +activities(card=this mode="linkedcard") + else if isLinkedBoard + +activities(card=this mode="linkedboard") + else + +activities(card=this mode="card") template(name="editCardTitleForm") textarea.js-edit-card-title(rows='1' autofocus dir="auto") diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index 1f9dc7773..6511c8210 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -54,6 +54,10 @@ BlazeComponent.extendComponent({ return Meteor.user().hasHiddenSystemMessages(); }, + cardMaximized() { + return Meteor.user().hasCardMaximized(); + }, + canModifyCard() { return ( Meteor.user() && @@ -408,6 +412,14 @@ BlazeComponent.extendComponent({ 'click #toggleButton'() { Meteor.call('toggleSystemMessages'); }, + 'click #js-maximize-card-details'() { + Meteor.call('toggleCardMaximized'); + autosize($('.card-details')); + }, + 'click #js-minimize-card-details'() { + Meteor.call('toggleCardMaximized'); + autosize($('.card-details')); + }, 'click .js-vote'(e) { const forIt = $(e.target).hasClass('js-vote-positive'); let newState = null; diff --git a/client/components/cards/cardDetails.styl b/client/components/cards/cardDetails.styl index fe5c50bf6..9a57a25bd 100644 --- a/client/components/cards/cardDetails.styl +++ b/client/components/cards/cardDetails.styl @@ -86,21 +86,62 @@ avatar-radius = 50% // Other card details -.card-details - padding: 0 - flex-shrink: 0 - flex-basis: 600px - will-change: flex-basis - overflow-y: scroll - overflow-x: hidden - background: darken(white, 3%) - border-radius: bottom 3px - z-index: 20 !important - animation: flexGrowIn 0.1s - box-shadow: 0 0 7px 0 darken(white, 30%) - transition: flex-basis 0.1s - box-sizing: border-box +unless isMiniScreen + if cardMaximized + .card-details + padding: 0 + flex-shrink: 0 + flex-basis: calc(100% - 20px) + will-change: flex-basis + overflow-y: scroll + overflow-x: scroll + background: darken(white, 3%) + border-radius: bottom 3px + z-index: 1000 !important + animation: flexGrowIn 0.1s + box-shadow: 0 0 7px 0 darken(white, 30%) + transition: flex-basis 0.1s + box-sizing: border-box + position: absolute + top: 0 + left: 0 + height: calc(100% - 20px) + width: calc(100% - 20px) + float: left + .card-details-left + position: absolute + float: left + top: 60px + left: 20px + width: 47% + + .card-details-right + position: absolute + float: right + top: 20px + left: 50% + + .card-details-header + width: 47% + +if isMiniScreen + .card-details + padding: 0 + flex-shrink: 0 + flex-basis: 600px + will-change: flex-basis + overflow-y: scroll + overflow-x: hidden + background: darken(white, 3%) + border-radius: bottom 3px + z-index: 20 !important + animation: flexGrowIn 0.1s + box-shadow: 0 0 7px 0 darken(white, 30%) + transition: flex-basis 0.1s + box-sizing: border-box + +.card-details .mCustomScrollBox padding-left: 0 @@ -110,11 +151,13 @@ avatar-radius = 50% .card-details-header margin: 0 -20px 5px - padding 7px 20px + padding: 7px 20px background: darken(white, 7%) border-bottom: 1px solid darken(white, 14%) .close-card-details, + .maximize-card-details, + .minimize-card-details, .card-details-menu, .card-copy-button, .card-copy-mobile-button, @@ -122,7 +165,9 @@ avatar-radius = 50% .card-details-menu-mobile-web float: right - .close-card-details + .close-card-details, + .maximize-card-details, + .minimize-card-details font-size: 24px padding: 5px margin-right: -8px @@ -260,7 +305,13 @@ input[type="submit"].attachment-add-link-submit margin-right: 0px .card-details-menu - margin-right: 10px + margin-right: 40px + + .maximize-card-details + margin-right: 40px + + .minimize-card-details + margin-right: 40px card-details-color(background, color...) background: background !important diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index 9a0254654..a84ff69bb 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -1048,5 +1048,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } diff --git a/models/users.js b/models/users.js index 1ad7f1a9c..38b76f436 100644 --- a/models/users.js +++ b/models/users.js @@ -164,7 +164,7 @@ Users.attachSchema( }, 'profile.showDesktopDragHandles': { /** - * does the user want to hide system messages? + * does the user want to show desktop drag handles? */ type: Boolean, optional: true, @@ -176,6 +176,13 @@ Users.attachSchema( type: Boolean, optional: true, }, + 'profile.cardMaximized': { + /** + * has user clicked maximize card? + */ + type: Boolean, + optional: true, + }, 'profile.hiddenSystemMessages': { /** * does the user want to hide system messages? @@ -641,6 +648,11 @@ Users.helpers({ return profile.hiddenSystemMessages || false; }, + hasCardMaximized() { + const profile = this.profile || {}; + return profile.cardMaximized || false; + }, + hasHiddenMinicardLabelText() { const profile = this.profile || {}; return profile.hiddenMinicardLabelText || false; @@ -793,6 +805,14 @@ Users.mutations({ }; }, + toggleCardMaximized(value = false) { + return { + $set: { + 'profile.cardMaximized': !value, + }, + }; + }, + toggleLabelText(value = false) { return { $set: { @@ -887,6 +907,10 @@ Meteor.methods({ const user = Meteor.user(); user.toggleSystem(user.hasHiddenSystemMessages()); }, + toggleCardMaximized() { + const user = Meteor.user(); + user.toggleCardMaximized(user.hasCardMaximized()); + }, toggleMinicardLabelText() { const user = Meteor.user(); user.toggleLabelText(user.hasHiddenMinicardLabelText()); From 7a25f542e87e1129ebfcc0b3750524d651589a48 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 12 Jun 2021 12:58:53 +0300 Subject: [PATCH 61/81] Updated translations. --- i18n/ar-EG.i18n.json | 4 +++- i18n/ar.i18n.json | 4 +++- i18n/bg.i18n.json | 4 +++- i18n/br.i18n.json | 4 +++- i18n/ca.i18n.json | 4 +++- i18n/cs.i18n.json | 4 +++- i18n/da.i18n.json | 4 +++- i18n/de-CH.i18n.json | 4 +++- i18n/de.i18n.json | 4 +++- i18n/el.i18n.json | 4 +++- i18n/en-GB.i18n.json | 4 +++- i18n/eo.i18n.json | 4 +++- i18n/es-AR.i18n.json | 4 +++- i18n/es-CL.i18n.json | 4 +++- i18n/es-LA.i18n.json | 4 +++- i18n/es-MX.i18n.json | 4 +++- i18n/es-PE.i18n.json | 4 +++- i18n/es-PY.i18n.json | 4 +++- i18n/es.i18n.json | 4 +++- i18n/eu.i18n.json | 4 +++- i18n/fa-IR.i18n.json | 4 +++- i18n/fa.i18n.json | 4 +++- i18n/fi.i18n.json | 4 +++- i18n/fr.i18n.json | 4 +++- i18n/gl.i18n.json | 4 +++- i18n/he.i18n.json | 4 +++- i18n/hi.i18n.json | 4 +++- i18n/hr.i18n.json | 4 +++- i18n/hu.i18n.json | 4 +++- i18n/hy.i18n.json | 4 +++- i18n/id.i18n.json | 4 +++- i18n/ig.i18n.json | 4 +++- i18n/it.i18n.json | 4 +++- i18n/ja.i18n.json | 4 +++- i18n/ka.i18n.json | 4 +++- i18n/km.i18n.json | 4 +++- i18n/ko.i18n.json | 4 +++- i18n/lt.i18n.json | 4 +++- i18n/lv.i18n.json | 4 +++- i18n/mk.i18n.json | 4 +++- i18n/mn.i18n.json | 4 +++- i18n/nb.i18n.json | 4 +++- i18n/nl.i18n.json | 18 ++++++++++-------- i18n/oc.i18n.json | 4 +++- i18n/pa.i18n.json | 4 +++- i18n/pl.i18n.json | 4 +++- i18n/pt-BR.i18n.json | 4 +++- i18n/pt.i18n.json | 4 +++- i18n/ro.i18n.json | 4 +++- i18n/ru.i18n.json | 4 +++- i18n/sk.i18n.json | 4 +++- i18n/sl.i18n.json | 4 +++- i18n/sr.i18n.json | 4 +++- i18n/sv.i18n.json | 4 +++- i18n/sw.i18n.json | 4 +++- i18n/ta.i18n.json | 4 +++- i18n/th.i18n.json | 4 +++- i18n/tr.i18n.json | 4 +++- i18n/uk.i18n.json | 4 +++- i18n/vi.i18n.json | 4 +++- i18n/zh-CN.i18n.json | 4 +++- i18n/zh-HK.i18n.json | 4 +++- i18n/zh-TW.i18n.json | 4 +++- 63 files changed, 196 insertions(+), 70 deletions(-) diff --git a/i18n/ar-EG.i18n.json b/i18n/ar-EG.i18n.json index f127b1b7f..676e8960b 100644 --- a/i18n/ar-EG.i18n.json +++ b/i18n/ar-EG.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/ar.i18n.json b/i18n/ar.i18n.json index dbbcdd7e2..73fd9176d 100644 --- a/i18n/ar.i18n.json +++ b/i18n/ar.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/bg.i18n.json b/i18n/bg.i18n.json index 78ce9bf2a..294bb9169 100644 --- a/i18n/bg.i18n.json +++ b/i18n/bg.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/br.i18n.json b/i18n/br.i18n.json index 1f3877d47..9167d2f49 100644 --- a/i18n/br.i18n.json +++ b/i18n/br.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/ca.i18n.json b/i18n/ca.i18n.json index 92a13c399..f893e5336 100644 --- a/i18n/ca.i18n.json +++ b/i18n/ca.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/cs.i18n.json b/i18n/cs.i18n.json index 2374437aa..1053b8da5 100644 --- a/i18n/cs.i18n.json +++ b/i18n/cs.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/da.i18n.json b/i18n/da.i18n.json index 9c15118fc..168f1fab2 100644 --- a/i18n/da.i18n.json +++ b/i18n/da.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/de-CH.i18n.json b/i18n/de-CH.i18n.json index d4dbff42b..107d5b1e8 100644 --- a/i18n/de-CH.i18n.json +++ b/i18n/de-CH.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json index a4eb8b47e..72ead4bfd 100644 --- a/i18n/de.i18n.json +++ b/i18n/de.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Doppelpuls-Warte-Symbol", "Rotateplane": "Drehscheibe-Warte-Symbol", "Scaleout": "Scaleout-Warte-Symbol", - "Wave": "Wellen-Warte-Symbol" + "Wave": "Wellen-Warte-Symbol", + "maximize-card": "Karte maximieren", + "minimize-card": "Karte minimieren" } \ No newline at end of file diff --git a/i18n/el.i18n.json b/i18n/el.i18n.json index fea520b81..61e1245ba 100644 --- a/i18n/el.i18n.json +++ b/i18n/el.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/en-GB.i18n.json b/i18n/en-GB.i18n.json index ee99c9abf..3226df027 100644 --- a/i18n/en-GB.i18n.json +++ b/i18n/en-GB.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/eo.i18n.json b/i18n/eo.i18n.json index b4ebe6fa3..292015629 100644 --- a/i18n/eo.i18n.json +++ b/i18n/eo.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/es-AR.i18n.json b/i18n/es-AR.i18n.json index 66e6106fc..fa357e9c4 100644 --- a/i18n/es-AR.i18n.json +++ b/i18n/es-AR.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/es-CL.i18n.json b/i18n/es-CL.i18n.json index 9389c065c..0b4b62eb7 100644 --- a/i18n/es-CL.i18n.json +++ b/i18n/es-CL.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/es-LA.i18n.json b/i18n/es-LA.i18n.json index f127b1b7f..676e8960b 100644 --- a/i18n/es-LA.i18n.json +++ b/i18n/es-LA.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/es-MX.i18n.json b/i18n/es-MX.i18n.json index a591acac9..03944c6f8 100644 --- a/i18n/es-MX.i18n.json +++ b/i18n/es-MX.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/es-PE.i18n.json b/i18n/es-PE.i18n.json index 6830127ac..4bc921929 100644 --- a/i18n/es-PE.i18n.json +++ b/i18n/es-PE.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/es-PY.i18n.json b/i18n/es-PY.i18n.json index f127b1b7f..676e8960b 100644 --- a/i18n/es-PY.i18n.json +++ b/i18n/es-PY.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/es.i18n.json b/i18n/es.i18n.json index 1f280ae95..21b777e38 100644 --- a/i18n/es.i18n.json +++ b/i18n/es.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/eu.i18n.json b/i18n/eu.i18n.json index da99e89cb..714127f9f 100644 --- a/i18n/eu.i18n.json +++ b/i18n/eu.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/fa-IR.i18n.json b/i18n/fa-IR.i18n.json index f509b7ab5..05c949939 100644 --- a/i18n/fa-IR.i18n.json +++ b/i18n/fa-IR.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/fa.i18n.json b/i18n/fa.i18n.json index f12b64a60..a4cc18674 100644 --- a/i18n/fa.i18n.json +++ b/i18n/fa.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/fi.i18n.json b/i18n/fi.i18n.json index d8a9f4f24..7747282c8 100644 --- a/i18n/fi.i18n.json +++ b/i18n/fi.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Tupla pomppu odotus pyörijä", "Rotateplane": "Pyöritä tasoa odotus pyörijä", "Scaleout": "Skaalaus ulos odotus pyörijä", - "Wave": "Aalto odotus pyörijä" + "Wave": "Aalto odotus pyörijä", + "maximize-card": "Suurenna kortti", + "minimize-card": "Pienennä kortti" } \ No newline at end of file diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json index 0f3f7286f..f5d00fcc4 100644 --- a/i18n/fr.i18n.json +++ b/i18n/fr.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/gl.i18n.json b/i18n/gl.i18n.json index 089218f06..8d24c99ba 100644 --- a/i18n/gl.i18n.json +++ b/i18n/gl.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/he.i18n.json b/i18n/he.i18n.json index 456fb22ee..fc41dc514 100644 --- a/i18n/he.i18n.json +++ b/i18n/he.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/hi.i18n.json b/i18n/hi.i18n.json index ce49b30e3..e26aef204 100644 --- a/i18n/hi.i18n.json +++ b/i18n/hi.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/hr.i18n.json b/i18n/hr.i18n.json index cb498fc67..b3ada69d6 100644 --- a/i18n/hr.i18n.json +++ b/i18n/hr.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/hu.i18n.json b/i18n/hu.i18n.json index 55856d7dc..4b8bdc184 100644 --- a/i18n/hu.i18n.json +++ b/i18n/hu.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/hy.i18n.json b/i18n/hy.i18n.json index f71c2d090..265a3461a 100644 --- a/i18n/hy.i18n.json +++ b/i18n/hy.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/id.i18n.json b/i18n/id.i18n.json index e9e3b112d..7020eddc6 100644 --- a/i18n/id.i18n.json +++ b/i18n/id.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/ig.i18n.json b/i18n/ig.i18n.json index 0081b565d..72e065a98 100644 --- a/i18n/ig.i18n.json +++ b/i18n/ig.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json index 72995504a..e3c2a464b 100644 --- a/i18n/it.i18n.json +++ b/i18n/it.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/ja.i18n.json b/i18n/ja.i18n.json index fbb398ab3..a1691587a 100644 --- a/i18n/ja.i18n.json +++ b/i18n/ja.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/ka.i18n.json b/i18n/ka.i18n.json index aaa4cddba..809fcc407 100644 --- a/i18n/ka.i18n.json +++ b/i18n/ka.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/km.i18n.json b/i18n/km.i18n.json index a397aeea8..dfee25c17 100644 --- a/i18n/km.i18n.json +++ b/i18n/km.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/ko.i18n.json b/i18n/ko.i18n.json index b39ec0e85..8ce9d0a02 100644 --- a/i18n/ko.i18n.json +++ b/i18n/ko.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/lt.i18n.json b/i18n/lt.i18n.json index f127b1b7f..676e8960b 100644 --- a/i18n/lt.i18n.json +++ b/i18n/lt.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/lv.i18n.json b/i18n/lv.i18n.json index 8801d1a7e..4dfb289e0 100644 --- a/i18n/lv.i18n.json +++ b/i18n/lv.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/mk.i18n.json b/i18n/mk.i18n.json index 01ea71d42..124837d7b 100644 --- a/i18n/mk.i18n.json +++ b/i18n/mk.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/mn.i18n.json b/i18n/mn.i18n.json index 5cea7507b..197d289e5 100644 --- a/i18n/mn.i18n.json +++ b/i18n/mn.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/nb.i18n.json b/i18n/nb.i18n.json index 031a96a0f..e6faf64e0 100644 --- a/i18n/nb.i18n.json +++ b/i18n/nb.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/nl.i18n.json b/i18n/nl.i18n.json index 91d208aa8..1b6d5e943 100644 --- a/i18n/nl.i18n.json +++ b/i18n/nl.i18n.json @@ -1040,12 +1040,14 @@ "copySwimlanePopup-title": "Kopieer Swimlane", "display-card-creator": "Toon Aanmaker Kaart", "wait-spinner": "Wacht Spinner", - "Bounce": "Bounce Wait Spinner", - "Cube": "Cube Wait Spinner", - "Cube-Grid": "Cube-Grid Wait Spinner", - "Dot": "Dot Wait Spinner", - "Double-Bounce": "Double Bounce Wait Spinner", - "Rotateplane": "Rotateplane Wait Spinner", - "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Bounce": "Stuiterende Wacht Spinner", + "Cube": "Kubus Wacht Spinner", + "Cube-Grid": "Raster-Kubus Wacht Spinner", + "Dot": "Stip Wacht Spinner", + "Double-Bounce": "Dubbel Stuiterende Wacht Spinner", + "Rotateplane": "Roterend Vlak Wacht Spinner", + "Scaleout": "Vergrotende Wacht Spinner", + "Wave": "Golvende Wacht Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/oc.i18n.json b/i18n/oc.i18n.json index 019ee93a7..6a16cde18 100644 --- a/i18n/oc.i18n.json +++ b/i18n/oc.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/pa.i18n.json b/i18n/pa.i18n.json index f127b1b7f..676e8960b 100644 --- a/i18n/pa.i18n.json +++ b/i18n/pa.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/pl.i18n.json b/i18n/pl.i18n.json index 7acc87171..6b27e7eda 100644 --- a/i18n/pl.i18n.json +++ b/i18n/pl.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/pt-BR.i18n.json b/i18n/pt-BR.i18n.json index 22ceee9f2..d258b86f6 100644 --- a/i18n/pt-BR.i18n.json +++ b/i18n/pt-BR.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/pt.i18n.json b/i18n/pt.i18n.json index 387cde4ae..314fed59d 100644 --- a/i18n/pt.i18n.json +++ b/i18n/pt.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/ro.i18n.json b/i18n/ro.i18n.json index 285f242ba..4dfbe6560 100644 --- a/i18n/ro.i18n.json +++ b/i18n/ro.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/ru.i18n.json b/i18n/ru.i18n.json index 3aaff6f2d..ccc48ee73 100644 --- a/i18n/ru.i18n.json +++ b/i18n/ru.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Двойной прыгающий спинер ожидания", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/sk.i18n.json b/i18n/sk.i18n.json index 2207c5361..c6abb8f0a 100644 --- a/i18n/sk.i18n.json +++ b/i18n/sk.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/sl.i18n.json b/i18n/sl.i18n.json index 0d15845a1..81bb3bdc0 100644 --- a/i18n/sl.i18n.json +++ b/i18n/sl.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/sr.i18n.json b/i18n/sr.i18n.json index d2f44c225..13595314d 100644 --- a/i18n/sr.i18n.json +++ b/i18n/sr.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/sv.i18n.json b/i18n/sv.i18n.json index ec952c25e..f86cf3d86 100644 --- a/i18n/sv.i18n.json +++ b/i18n/sv.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/sw.i18n.json b/i18n/sw.i18n.json index 44f4b836d..536e47a36 100644 --- a/i18n/sw.i18n.json +++ b/i18n/sw.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/ta.i18n.json b/i18n/ta.i18n.json index 04a4d4864..46c1ee8cf 100644 --- a/i18n/ta.i18n.json +++ b/i18n/ta.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/th.i18n.json b/i18n/th.i18n.json index 95aa34113..b5117f119 100644 --- a/i18n/th.i18n.json +++ b/i18n/th.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/tr.i18n.json b/i18n/tr.i18n.json index 3bd92813a..e9210e989 100644 --- a/i18n/tr.i18n.json +++ b/i18n/tr.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/uk.i18n.json b/i18n/uk.i18n.json index e2c969923..e1f4cd38b 100644 --- a/i18n/uk.i18n.json +++ b/i18n/uk.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/vi.i18n.json b/i18n/vi.i18n.json index 96a852431..b8889d08e 100644 --- a/i18n/vi.i18n.json +++ b/i18n/vi.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/zh-CN.i18n.json b/i18n/zh-CN.i18n.json index ab46668fc..476e54f86 100644 --- a/i18n/zh-CN.i18n.json +++ b/i18n/zh-CN.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/zh-HK.i18n.json b/i18n/zh-HK.i18n.json index e91e35e88..6eb151c0c 100644 --- a/i18n/zh-HK.i18n.json +++ b/i18n/zh-HK.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file diff --git a/i18n/zh-TW.i18n.json b/i18n/zh-TW.i18n.json index c95cd0a8b..7b13d98d2 100644 --- a/i18n/zh-TW.i18n.json +++ b/i18n/zh-TW.i18n.json @@ -1047,5 +1047,7 @@ "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner" + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card" } \ No newline at end of file From 90152ab9f5090c6cfa1bf9ca67ccb9269cebbc84 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 12 Jun 2021 13:07:27 +0300 Subject: [PATCH 62/81] Updated ChangeLog. --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa0847115..3c45a5cfe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,13 @@ This release adds the following new features: [Part 1](https://github.com/wekan/wekan/commit/7f3f0825573b1f8a7b0388e4bacbb0bd2525e886). Added Wait Spinners docs: https://github.com/wekan/wekan/wiki/Wait-Spinners . Thanks to xet7. +- [Maximize Card. In Progress](https://github.com/wekan/wekan/commit/8c572502436a2eb22bd1eb1e4069c1c9145e2070). + Thanks to xet7. + +and adds the following improvements: + +- [Add border and update label colors for better visibility](https://github.com/wekan/wekan/commit/2e1eb1e224c83f16a384316626d7a4183639d4cd). + Thanks to xet7. Thanks to above GitHub users for their contributions and translators for their translations. From a2f2ce11354a8dbfdd6759e3b65797e4be4cc6ec Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 12 Jun 2021 14:50:18 +0300 Subject: [PATCH 63/81] Export Card to PDF. In Progress. Thanks to xet7 ! --- .meteor/packages | 1 + .meteor/versions | 1 + client/components/cards/cardDetails.jade | 13 + client/components/cards/cardDetails.js | 32 +- i18n/en.i18n.json | 4 + models/exportPDF.js | 691 +++++++++++++++++++++++ 6 files changed, 741 insertions(+), 1 deletion(-) create mode 100644 models/exportPDF.js diff --git a/.meteor/packages b/.meteor/packages index d94755f7a..5cc6f9ff6 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -144,3 +144,4 @@ rajit:bootstrap3-datepicker-zh-tw staringatlights:fast-render spacebars easylogic:summernote +pascoual:pdfkit diff --git a/.meteor/versions b/.meteor/versions index 718c63b7c..4e8ad77ee 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -114,6 +114,7 @@ oauth2@1.3.0 observe-sequence@1.0.16 ongoworks:speakingurl@1.1.0 ordered-dict@1.1.0 +pascoual:pdfkit@1.0.7 peerlibrary:assert@0.3.0 peerlibrary:base-component@0.16.0 peerlibrary:blaze-components@0.15.1 diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade index 66bf708fd..3ace94150 100644 --- a/client/components/cards/cardDetails.jade +++ b/client/components/cards/cardDetails.jade @@ -609,6 +609,12 @@ template(name="cardDetailsActionsPopup") i.fa.fa-paint-brush | {{_ 'setCardColorPopup-title'}} hr + ul.pop-over-list + li + a.js-export-card + i.fa.fa-share-alt + | {{_ 'export-card'}} + hr ul.pop-over-list li a.js-move-card-to-top @@ -653,6 +659,13 @@ template(name="cardDetailsActionsPopup") i.fa.fa-link | {{_ 'cardMorePopup-title'}} +template(name="exportCard") + ul.pop-over-list + li + a(href="{{exportUrlCardPDF}}",, download="{{exportFilenameCardPDF}}") + i.fa.fa-share-alt + | {{_ 'export-card-pdf'}} + template(name="moveCardPopup") +boardsAndLists diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index 6511c8210..5c860c2d9 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -511,9 +511,38 @@ BlazeComponent.extendComponent({ }, }).register('cardDetails'); +BlazeComponent.extendComponent({ + template() { + return 'exportCard'; + }, + withApi() { + return Template.instance().apiEnabled.get(); + }, + exportUrlCardPDF() { + const params = { + boardId: Session.get('currentBoard'), + listId: this.listId, + cardId: this.cardId, + }; + const queryParams = { + authToken: Accounts._storedLoginToken(), + }; + return FlowRouter.path( + '/api/boards/:boardId/lists/:listId/cards/:cardId/exportPDF', + params, + queryParams, + ); + }, + exportFilenameCardPDF() { + //const boardId = Session.get('currentBoard'); + //return `export-card-pdf-${boardId}.xlsx`; + return `export-card.pdf`; + }, +}).register('exportCardPopup'); + // only allow number input Template.editCardSortOrderForm.onRendered(function() { - this.$('input').on("keypress paste", function() { + this.$('input').on("keypress paste", function(event) { let keyCode = event.keyCode; let charCode = String.fromCharCode(keyCode); let regex = new RegExp('[-0-9.]'); @@ -583,6 +612,7 @@ Template.cardDetailsActionsPopup.helpers({ }); Template.cardDetailsActionsPopup.events({ + 'click .js-export-card': Popup.open('exportCard'), 'click .js-members': Popup.open('cardMembers'), 'click .js-assignees': Popup.open('cardAssignees'), 'click .js-labels': Popup.open('cardLabels'), diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index a84ff69bb..d659ed34f 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/models/exportPDF.js b/models/exportPDF.js new file mode 100644 index 000000000..e9236304d --- /dev/null +++ b/models/exportPDF.js @@ -0,0 +1,691 @@ +if (Meteor.isServer) { + // todo XXX once we have a real API in place, move that route there + // todo XXX also share the route definition between the client and the server + // so that we could use something like + // `ApiRoutes.path('boards/exportExcel', boardId)`` + // on the client instead of copy/pasting the route path manually between the + // client and the server. + /** + * @operation exportExcel + * @tag Boards + * + * @summary This route is used to export the board Excel. + * + * @description If user is already logged-in, pass loginToken as param + * "authToken": '/api/boards/:boardId/exportExcel?authToken=:token' + * + * See https://blog.kayla.com.au/server-side-route-authentication-in-meteor/ + * for detailed explanations + * + * @param {string} boardId the ID of the board we are exporting + * @param {string} authToken the loginToken + */ + const Excel = require('exceljs'); + Picker.route('/api/boards/:boardId/lists/:listId/cards/:cardId/exportPDF', function (params, req, res) { + const boardId = params.boardId; + const paramListId = req.params.listId; + const paramCardId = req.params.cardId; + let user = null; + let impersonateDone = false; + let adminId = null; + const loginToken = params.query.authToken; + if (loginToken) { + const hashToken = Accounts._hashLoginToken(loginToken); + user = Meteor.users.findOne({ + 'services.resume.loginTokens.hashedToken': hashToken, + }); + adminId = user._id.toString(); + impersonateDone = ImpersonatedUsers.findOne({ + adminId: adminId, + }); + } else if (!Meteor.settings.public.sandstorm) { + Authentication.checkUserId(req.userId); + user = Users.findOne({ + _id: req.userId, + isAdmin: true, + }); + } + const exporterExcel = new ExporterCardPDF(boardId); + if (exporterCardPDF.canExport(user) || impersonateDone) { + if (impersonateDone) { + ImpersonatedUsers.insert({ + adminId: adminId, + boardId: boardId, + reason: 'exportCardPDF', + }); + } + + exporterCardPDF.build(res); + } else { + res.end(TAPi18n.__('user-can-not-export-card-to-pdf')); + } + }); +} + +// exporter maybe is broken since Gridfs introduced, add fs and path + +export class ExporterCardPDF { + constructor(boardId) { + this._boardId = boardId; + } + + build(res) { + +/* + const fs = Npm.require('fs'); + const os = Npm.require('os'); + const path = Npm.require('path'); + + const byBoard = { + boardId: this._boardId, + }; + const byBoardNoLinked = { + boardId: this._boardId, + linkedId: { + $in: ['', null], + }, + }; + // we do not want to retrieve boardId in related elements + const noBoardId = { + fields: { + boardId: 0, + }, + }; + const result = { + _format: 'wekan-board-1.0.0', + }; + _.extend( + result, + Boards.findOne(this._boardId, { + fields: { + stars: 0, + }, + }), + ); + result.lists = Lists.find(byBoard, noBoardId).fetch(); + result.cards = Cards.find(byBoardNoLinked, noBoardId).fetch(); + result.swimlanes = Swimlanes.find(byBoard, noBoardId).fetch(); + result.customFields = CustomFields.find( + { + boardIds: { + $in: [this.boardId], + }, + }, + { + fields: { + boardId: 0, + }, + }, + ).fetch(); + result.comments = CardComments.find(byBoard, noBoardId).fetch(); + result.activities = Activities.find(byBoard, noBoardId).fetch(); + result.rules = Rules.find(byBoard, noBoardId).fetch(); + result.checklists = []; + result.checklistItems = []; + result.subtaskItems = []; + result.triggers = []; + result.actions = []; + result.cards.forEach((card) => { + result.checklists.push( + ...Checklists.find({ + cardId: card._id, + }).fetch(), + ); + result.checklistItems.push( + ...ChecklistItems.find({ + cardId: card._id, + }).fetch(), + ); + result.subtaskItems.push( + ...Cards.find({ + parentId: card._id, + }).fetch(), + ); + }); + result.rules.forEach((rule) => { + result.triggers.push( + ...Triggers.find( + { + _id: rule.triggerId, + }, + noBoardId, + ).fetch(), + ); + result.actions.push( + ...Actions.find( + { + _id: rule.actionId, + }, + noBoardId, + ).fetch(), + ); + }); + + // we also have to export some user data - as the other elements only + // include id but we have to be careful: + // 1- only exports users that are linked somehow to that board + // 2- do not export any sensitive information + const users = {}; + result.members.forEach((member) => { + users[member.userId] = true; + }); + result.lists.forEach((list) => { + users[list.userId] = true; + }); + result.cards.forEach((card) => { + users[card.userId] = true; + if (card.members) { + card.members.forEach((memberId) => { + users[memberId] = true; + }); + } + if (card.assignees) { + card.assignees.forEach((memberId) => { + users[memberId] = true; + }); + } + }); + result.comments.forEach((comment) => { + users[comment.userId] = true; + }); + result.activities.forEach((activity) => { + users[activity.userId] = true; + }); + result.checklists.forEach((checklist) => { + users[checklist.userId] = true; + }); + const byUserIds = { + _id: { + $in: Object.getOwnPropertyNames(users), + }, + }; + // we use whitelist to be sure we do not expose inadvertently + // some secret fields that gets added to User later. + const userFields = { + fields: { + _id: 1, + username: 1, + 'profile.initials': 1, + 'profile.avatarUrl': 1, + }, + }; + result.users = Users.find(byUserIds, userFields) + .fetch() + .map((user) => { + // user avatar is stored as a relative url, we export absolute + if ((user.profile || {}).avatarUrl) { + user.profile.avatarUrl = FlowRouter.url(user.profile.avatarUrl); + } + return user; + }); + + //init exceljs workbook + const Excel = require('exceljs'); + const workbook = new Excel.Workbook(); + workbook.creator = TAPi18n.__('export-board'); + workbook.lastModifiedBy = TAPi18n.__('export-board'); + workbook.created = new Date(); + workbook.modified = new Date(); + workbook.lastPrinted = new Date(); + const filename = `${result.title}.xlsx`; + //init worksheet + const worksheet = workbook.addWorksheet(result.title, { + properties: { + tabColor: { + argb: 'FFC0000', + }, + }, + pageSetup: { + paperSize: 9, + orientation: 'landscape', + }, + }); + //get worksheet + const ws = workbook.getWorksheet(result.title); + ws.properties.defaultRowHeight = 20; + //init columns + //Excel font. Western: Arial. zh-CN: 宋体 + ws.columns = [ + { + key: 'a', + width: 14, + }, + { + key: 'b', + width: 40, + }, + { + key: 'c', + width: 60, + }, + { + key: 'd', + width: 40, + }, + { + key: 'e', + width: 20, + }, + { + key: 'f', + width: 20, + style: { + font: { + name: TAPi18n.__('excel-font'), + size: '10', + }, + numFmt: 'yyyy/mm/dd hh:mm:ss', + }, + }, + { + key: 'g', + width: 20, + style: { + font: { + name: TAPi18n.__('excel-font'), + size: '10', + }, + numFmt: 'yyyy/mm/dd hh:mm:ss', + }, + }, + { + key: 'h', + width: 20, + style: { + font: { + name: TAPi18n.__('excel-font'), + size: '10', + }, + numFmt: 'yyyy/mm/dd hh:mm:ss', + }, + }, + { + key: 'i', + width: 20, + style: { + font: { + name: TAPi18n.__('excel-font'), + size: '10', + }, + numFmt: 'yyyy/mm/dd hh:mm:ss', + }, + }, + { + key: 'j', + width: 20, + style: { + font: { + name: TAPi18n.__('excel-font'), + size: '10', + }, + numFmt: 'yyyy/mm/dd hh:mm:ss', + }, + }, + { + key: 'k', + width: 20, + style: { + font: { + name: TAPi18n.__('excel-font'), + size: '10', + }, + numFmt: 'yyyy/mm/dd hh:mm:ss', + }, + }, + { + key: 'l', + width: 20, + }, + { + key: 'm', + width: 20, + }, + { + key: 'n', + width: 20, + }, + { + key: 'o', + width: 20, + }, + { + key: 'p', + width: 20, + }, + { + key: 'q', + width: 20, + }, + { + key: 'r', + width: 20, + }, + ]; + + //add title line + ws.mergeCells('A1:H1'); + ws.getCell('A1').value = result.title; + ws.getCell('A1').style = { + font: { + name: TAPi18n.__('excel-font'), + size: '20', + }, + }; + ws.getCell('A1').alignment = { + vertical: 'middle', + horizontal: 'center', + }; + ws.getRow(1).height = 40; + //get member and assignee info + let jmem = ''; + let jassig = ''; + const jmeml = {}; + const jassigl = {}; + for (const i in result.users) { + jmem = `${jmem + result.users[i].username},`; + jmeml[result.users[i]._id] = result.users[i].username; + } + jmem = jmem.substr(0, jmem.length - 1); + for (const ia in result.users) { + jassig = `${jassig + result.users[ia].username},`; + jassigl[result.users[ia]._id] = result.users[ia].username; + } + jassig = jassig.substr(0, jassig.length - 1); + //get kanban list info + const jlist = {}; + for (const klist in result.lists) { + jlist[result.lists[klist]._id] = result.lists[klist].title; + } + //get kanban swimlanes info + const jswimlane = {}; + for (const kswimlane in result.swimlanes) { + jswimlane[result.swimlanes[kswimlane]._id] = + result.swimlanes[kswimlane].title; + } + //get kanban label info + const jlabel = {}; + var isFirst = 1; + for (const klabel in result.labels) { + // console.log(klabel); + if (isFirst == 0) { + jlabel[result.labels[klabel]._id] = `,${result.labels[klabel].name}`; + } else { + isFirst = 0; + jlabel[result.labels[klabel]._id] = result.labels[klabel].name; + } + } + //add data +8 hours + function addTZhours(jdate) { + const curdate = new Date(jdate); + const checkCorrectDate = moment(curdate); + if (checkCorrectDate.isValid()) { + return curdate; + } else { + return ' '; + } + ////Do not add 8 hours to GMT. Use GMT instead. + ////Could not yet figure out how to get localtime. + //return new Date(curdate.setHours(curdate.getHours() + 8)); + //return curdate; + } + //add blank row + ws.addRow().values = ['', '', '', '', '', '']; + //add kanban info + ws.addRow().values = [ + TAPi18n.__('createdAt'), + addTZhours(result.createdAt), + TAPi18n.__('modifiedAt'), + addTZhours(result.modifiedAt), + TAPi18n.__('members'), + jmem, + ]; + ws.getRow(3).font = { + name: TAPi18n.__('excel-font'), + size: 10, + bold: true, + }; + ws.mergeCells('F3:R3'); + ws.getCell('B3').style = { + font: { + name: TAPi18n.__('excel-font'), + size: '10', + bold: true, + }, + numFmt: 'yyyy/mm/dd hh:mm:ss', + }; + //cell center + function cellCenter(cellno) { + ws.getCell(cellno).alignment = { + vertical: 'middle', + horizontal: 'center', + wrapText: true, + }; + } + function cellLeft(cellno) { + ws.getCell(cellno).alignment = { + vertical: 'middle', + horizontal: 'left', + wrapText: true, + }; + } + cellCenter('A3'); + cellCenter('B3'); + cellCenter('C3'); + cellCenter('D3'); + cellCenter('E3'); + cellLeft('F3'); + ws.getRow(3).height = 20; + //all border + function allBorder(cellno) { + ws.getCell(cellno).border = { + top: { + style: 'thin', + }, + left: { + style: 'thin', + }, + bottom: { + style: 'thin', + }, + right: { + style: 'thin', + }, + }; + } + allBorder('A3'); + allBorder('B3'); + allBorder('C3'); + allBorder('D3'); + allBorder('E3'); + allBorder('F3'); + //add blank row + ws.addRow().values = [ + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + ]; + //add card title + //ws.addRow().values = ['编号', '标题', '创建人', '创建时间', '更新时间', '列表', '成员', '描述', '标签']; + //this is where order in which the excel file generates + ws.addRow().values = [ + TAPi18n.__('number'), + TAPi18n.__('title'), + TAPi18n.__('description'), + TAPi18n.__('parent-card'), + TAPi18n.__('owner'), + TAPi18n.__('createdAt'), + TAPi18n.__('last-modified-at'), + TAPi18n.__('card-received'), + TAPi18n.__('card-start'), + TAPi18n.__('card-due'), + TAPi18n.__('card-end'), + TAPi18n.__('list'), + TAPi18n.__('swimlane'), + TAPi18n.__('assignee'), + TAPi18n.__('members'), + TAPi18n.__('labels'), + TAPi18n.__('overtime-hours'), + TAPi18n.__('spent-time-hours'), + ]; + ws.getRow(5).height = 20; + allBorder('A5'); + allBorder('B5'); + allBorder('C5'); + allBorder('D5'); + allBorder('E5'); + allBorder('F5'); + allBorder('G5'); + allBorder('H5'); + allBorder('I5'); + allBorder('J5'); + allBorder('K5'); + allBorder('L5'); + allBorder('M5'); + allBorder('N5'); + allBorder('O5'); + allBorder('P5'); + allBorder('Q5'); + allBorder('R5'); + cellCenter('A5'); + cellCenter('B5'); + cellCenter('C5'); + cellCenter('D5'); + cellCenter('E5'); + cellCenter('F5'); + cellCenter('G5'); + cellCenter('H5'); + cellCenter('I5'); + cellCenter('J5'); + cellCenter('K5'); + cellCenter('L5'); + cellCenter('M5'); + cellCenter('N5'); + cellCenter('O5'); + cellCenter('P5'); + cellCenter('Q5'); + cellCenter('R5'); + ws.getRow(5).font = { + name: TAPi18n.__('excel-font'), + size: 12, + bold: true, + }; + //add blank row + //add card info + for (const i in result.cards) { + const jcard = result.cards[i]; + //get member info + let jcmem = ''; + for (const j in jcard.members) { + jcmem += jmeml[jcard.members[j]]; + jcmem += ' '; + } + //get assignee info + let jcassig = ''; + for (const ja in jcard.assignees) { + jcassig += jassigl[jcard.assignees[ja]]; + jcassig += ' '; + } + //get card label info + let jclabel = ''; + for (const jl in jcard.labelIds) { + jclabel += jlabel[jcard.labelIds[jl]]; + jclabel += ' '; + } + //get parent name + if (jcard.parentId) { + const parentCard = result.cards.find( + (card) => card._id === jcard.parentId, + ); + jcard.parentCardTitle = parentCard ? parentCard.title : ''; + } + + //add card detail + const t = Number(i) + 1; + ws.addRow().values = [ + t.toString(), + jcard.title, + jcard.description, + jcard.parentCardTitle, + jmeml[jcard.userId], + addTZhours(jcard.createdAt), + addTZhours(jcard.dateLastActivity), + addTZhours(jcard.receivedAt), + addTZhours(jcard.startAt), + addTZhours(jcard.dueAt), + addTZhours(jcard.endAt), + jlist[jcard.listId], + jswimlane[jcard.swimlaneId], + jcassig, + jcmem, + jclabel, + jcard.isOvertime ? 'true' : 'false', + jcard.spentTime, + ]; + const y = Number(i) + 6; + //ws.getRow(y).height = 25; + allBorder(`A${y}`); + allBorder(`B${y}`); + allBorder(`C${y}`); + allBorder(`D${y}`); + allBorder(`E${y}`); + allBorder(`F${y}`); + allBorder(`G${y}`); + allBorder(`H${y}`); + allBorder(`I${y}`); + allBorder(`J${y}`); + allBorder(`K${y}`); + allBorder(`L${y}`); + allBorder(`M${y}`); + allBorder(`N${y}`); + allBorder(`O${y}`); + allBorder(`P${y}`); + allBorder(`Q${y}`); + allBorder(`R${y}`); + cellCenter(`A${y}`); + ws.getCell(`B${y}`).alignment = { + wrapText: true, + }; + ws.getCell(`C${y}`).alignment = { + wrapText: true, + }; + ws.getCell(`M${y}`).alignment = { + wrapText: true, + }; + ws.getCell(`N${y}`).alignment = { + wrapText: true, + }; + ws.getCell(`O${y}`).alignment = { + wrapText: true, + }; + } + workbook.xlsx.write(res).then(function () {}); + */ + + var doc = new PDFDocument({size: 'A4', margin: 50}); + doc.fontSize(12); + doc.text('Some test text', 10, 30, {align: 'center', width: 200}); + this.response.writeHead(200, { + 'Content-type': 'application/pdf', + 'Content-Disposition': "attachment; filename=test.pdf" + }); + this.response.end( doc.outputSync() ); + + } + + canExport(user) { + const board = Boards.findOne(this._boardId); + return board && board.isVisibleBy(user); + } +} From e3e25bc233ae5ada30e95597c4d8bf197a6b8da7 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 12 Jun 2021 14:52:43 +0300 Subject: [PATCH 64/81] Updated ChangeLog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c45a5cfe..93f771106 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ This release adds the following new features: Thanks to xet7. - [Maximize Card. In Progress](https://github.com/wekan/wekan/commit/8c572502436a2eb22bd1eb1e4069c1c9145e2070). Thanks to xet7. +- [Export Card to PDF. In Progress](https://github.com/wekan/wekan/commit/a2f2ce11354a8dbfdd6759e3b65797e4be4cc6ec). + Thanks to xet7. and adds the following improvements: From f52f589f7d84cae4071e8ea784b7d05efcce476d Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 12 Jun 2021 15:01:48 +0300 Subject: [PATCH 65/81] Updated translations. --- i18n/ar-EG.i18n.json | 4 +++ i18n/ar.i18n.json | 4 +++ i18n/bg.i18n.json | 4 +++ i18n/br.i18n.json | 4 +++ i18n/ca.i18n.json | 4 +++ i18n/cs.i18n.json | 50 +++++++++++++++++--------------- i18n/da.i18n.json | 4 +++ i18n/de-CH.i18n.json | 4 +++ i18n/de.i18n.json | 4 +++ i18n/el.i18n.json | 4 +++ i18n/en-GB.i18n.json | 4 +++ i18n/eo.i18n.json | 4 +++ i18n/es-AR.i18n.json | 4 +++ i18n/es-CL.i18n.json | 4 +++ i18n/es-LA.i18n.json | 4 +++ i18n/es-MX.i18n.json | 4 +++ i18n/es-PE.i18n.json | 4 +++ i18n/es-PY.i18n.json | 4 +++ i18n/es.i18n.json | 4 +++ i18n/eu.i18n.json | 4 +++ i18n/fa-IR.i18n.json | 4 +++ i18n/fa.i18n.json | 4 +++ i18n/fi.i18n.json | 4 +++ i18n/fr.i18n.json | 4 +++ i18n/gl.i18n.json | 4 +++ i18n/he.i18n.json | 4 +++ i18n/hi.i18n.json | 4 +++ i18n/hr.i18n.json | 4 +++ i18n/hu.i18n.json | 4 +++ i18n/hy.i18n.json | 4 +++ i18n/id.i18n.json | 4 +++ i18n/ig.i18n.json | 4 +++ i18n/it.i18n.json | 4 +++ i18n/ja.i18n.json | 4 +++ i18n/ka.i18n.json | 4 +++ i18n/km.i18n.json | 4 +++ i18n/ko.i18n.json | 4 +++ i18n/lt.i18n.json | 4 +++ i18n/lv.i18n.json | 4 +++ i18n/mk.i18n.json | 4 +++ i18n/mn.i18n.json | 4 +++ i18n/nb.i18n.json | 68 +++++++++++++++++++++++--------------------- i18n/nl.i18n.json | 4 +++ i18n/oc.i18n.json | 4 +++ i18n/pa.i18n.json | 4 +++ i18n/pl.i18n.json | 4 +++ i18n/pt-BR.i18n.json | 4 +++ i18n/pt.i18n.json | 4 +++ i18n/ro.i18n.json | 4 +++ i18n/ru.i18n.json | 4 +++ i18n/sk.i18n.json | 4 +++ i18n/sl.i18n.json | 4 +++ i18n/sr.i18n.json | 4 +++ i18n/sv.i18n.json | 4 +++ i18n/sw.i18n.json | 4 +++ i18n/ta.i18n.json | 4 +++ i18n/th.i18n.json | 4 +++ i18n/tr.i18n.json | 4 +++ i18n/uk.i18n.json | 4 +++ i18n/vi.i18n.json | 4 +++ i18n/zh-CN.i18n.json | 4 +++ i18n/zh-HK.i18n.json | 4 +++ i18n/zh-TW.i18n.json | 4 +++ 63 files changed, 307 insertions(+), 55 deletions(-) diff --git a/i18n/ar-EG.i18n.json b/i18n/ar-EG.i18n.json index 676e8960b..657defbaf 100644 --- a/i18n/ar-EG.i18n.json +++ b/i18n/ar-EG.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/ar.i18n.json b/i18n/ar.i18n.json index 73fd9176d..709fad351 100644 --- a/i18n/ar.i18n.json +++ b/i18n/ar.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/bg.i18n.json b/i18n/bg.i18n.json index 294bb9169..cf449eb44 100644 --- a/i18n/bg.i18n.json +++ b/i18n/bg.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Експортиране на Табло", + "exportCardPopup-title": "Export card", "sort": "Сортирай", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/br.i18n.json b/i18n/br.i18n.json index 9167d2f49..f988ac022 100644 --- a/i18n/br.i18n.json +++ b/i18n/br.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/ca.i18n.json b/i18n/ca.i18n.json index f893e5336..f6186f0f8 100644 --- a/i18n/ca.i18n.json +++ b/i18n/ca.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Exporta tauler", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/cs.i18n.json b/i18n/cs.i18n.json index 1053b8da5..bb71a8acc 100644 --- a/i18n/cs.i18n.json +++ b/i18n/cs.i18n.json @@ -82,8 +82,8 @@ "add-attachment": "Přidat přílohu", "add-board": "Přidat tablo", "add-card": "Přidat kartu", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-card-to-top-of-list": "Přidat kartu na začátek seznamu", + "add-card-to-bottom-of-list": "Přidat kartu na konec seznamu", "add-swimlane": "Přidat Swimlane", "add-subtask": "Přidat Podúkol", "add-checklist": "Přidat zaškrtávací seznam", @@ -133,7 +133,7 @@ "board-not-found": "Tablo nenalezeno", "board-private-info": "Toto tablo bude soukromé.", "board-public-info": "Toto tablo bude veřejné.", - "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "board-drag-drop-reorder-or-click-open": "Přetažením změníte pořadí ikon tabel. Kliknutím otevřete tablo.", "boardChangeColorPopup-title": "Změnit pozadí tabla", "boardChangeTitlePopup-title": "Přejmenovat tablo", "boardChangeVisibilityPopup-title": "Upravit viditelnost", @@ -181,10 +181,10 @@ "vote-against": "proti", "deleteVotePopup-title": "Smazat hlas?", "vote-delete-pop": "Smazání je nevratné. Ztratíte vše spojené s tímto hlasováním.", - "cardStartPlanningPokerPopup-title": "Start a Planning Poker", - "card-edit-planning-poker": "Edit Planning Poker", - "editPokerEndDatePopup-title": "Change Planning Poker vote end date", - "poker-question": "Planning Poker", + "cardStartPlanningPokerPopup-title": "Zahájit plánovací poker", + "card-edit-planning-poker": "Upravit plánovací poker", + "editPokerEndDatePopup-title": "Změnit datum konce plánovacího pokeru", + "poker-question": "Plánovací poker", "poker-one": "1", "poker-two": "2", "poker-three": "3", @@ -195,13 +195,13 @@ "poker-forty": "40", "poker-oneHundred": "100", "poker-unsure": "?", - "poker-finish": "Finish", - "poker-result-votes": "Votes", - "poker-result-who": "Who", - "poker-replay": "Replay", - "set-estimation": "Set Estimation", - "deletePokerPopup-title": "Delete planning poker?", - "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "poker-finish": "Hotovo", + "poker-result-votes": "Hlasů", + "poker-result-who": "Kdo", + "poker-replay": "Zopakovat", + "set-estimation": "Nastavit odhad", + "deletePokerPopup-title": "Smazat plánovací poker?", + "poker-delete-pop": "Smazání je trvalé. Přijdete o všechny akce asociované s tímto plánovacím pokerem.", "cardDeletePopup-title": "Smazat kartu?", "cardDetailsActionsPopup-title": "Akce karty", "cardLabelsPopup-title": "Štítky", @@ -233,7 +233,7 @@ "close": "Zavřít", "close-board": "Zavřít tablo", "close-board-pop": "Budete moci obnovit tablo kliknutím na tlačítko \"Archiv\" v hlavním menu.", - "close-card": "Close Card", + "close-card": "Zavřít kartu", "color-black": "černá", "color-blue": "modrá", "color-crimson": "karmínová", @@ -358,7 +358,11 @@ "export-board-excel": "Exportovat tablo do Excelu", "user-can-not-export-excel": "Uživatel nemůže exportovat do Excelu", "export-board-html": "Exportovat tablo do HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Exportovat tablo", + "exportCardPopup-title": "Export card", "sort": "řadit", "sort-desc": "Kliknout pro třídění seznamu", "list-sort-by": "řadit seznam podle", @@ -447,8 +451,8 @@ "set-color-list": "Nastavit barvu", "listActionPopup-title": "Vypsat akce", "settingsUserPopup-title": "Nastavení uživatele", - "settingsTeamPopup-title": "Team Settings", - "settingsOrgPopup-title": "Organization Settings", + "settingsTeamPopup-title": "Nastavení týmu", + "settingsOrgPopup-title": "Nastavení organizace", "swimlaneActionPopup-title": "Akce swimlane", "swimlaneAddPopup-title": "Přidat swimlane dolů", "listImportCardPopup-title": "Importovat Trello kartu", @@ -664,7 +668,7 @@ "setListColorPopup-title": "Vyber barvu", "assigned-by": "Přidělil(a)", "requested-by": "Vyžádal(a)", - "card-sorting-by-number": "Card sorting by number", + "card-sorting-by-number": "Řazení karet podle čísla", "board-delete-notice": "Smazání je trvalé. Přijdete o všechny sloupce, karty a akce spojené s tímto tablem.", "delete-board-confirm-popup": "Všechny sloupce, štítky a aktivity budou smazány a obsah tabla nebude možné obnovit. Toto nelze vrátit zpět.", "boardDeletePopup-title": "Smazat tablo?", @@ -846,8 +850,8 @@ "act-duenow": "připomínal(a), že stávající termín dokončení (__timeValue__) __card__ je teď", "act-atUserComment": "Byli jste zmíněni v [__board__] __list__/__card__", "delete-user-confirm-popup": "Jste si jisti, že chcete smazat tento účet? Tuto akci nelze vrátit zpět.", - "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", - "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "delete-team-confirm-popup": "Jste si jisti, že chcete smazat tento tým? Tuto akci nelze vrátit zpět.", + "delete-org-confirm-popup": "Jste si jisti, že chcete smazat tuto organizaci? Tuto akci nelze vrátit zpět.", "accounts-allowUserDelete": "Dovolit uživatelům smazat vlastní účet", "hide-minicard-label-text": "Skrýt text popisku minikarty", "show-desktop-drag-handles": "Zobrazit okraje pro přesun plochy", @@ -1038,7 +1042,7 @@ "rulesReportTitle": "Report pravidel", "copy-swimlane": "Kopírovat dráhu", "copySwimlanePopup-title": "Kopírovat dráhu", - "display-card-creator": "Display Card Creator", + "display-card-creator": "Zobrazovat tvůrce karet", "wait-spinner": "Wait Spinner", "Bounce": "Bounce Wait Spinner", "Cube": "Cube Wait Spinner", @@ -1048,6 +1052,6 @@ "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", - "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" + "maximize-card": "Maximalizovat kartu", + "minimize-card": "Minimalizovat kartu" } \ No newline at end of file diff --git a/i18n/da.i18n.json b/i18n/da.i18n.json index 168f1fab2..b8f79ee78 100644 --- a/i18n/da.i18n.json +++ b/i18n/da.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Eksportér tavle til HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Eksportér tavle", + "exportCardPopup-title": "Export card", "sort": "Sortér", "sort-desc": "Klik for at sortere listen", "list-sort-by": "Sortér listen efter:", diff --git a/i18n/de-CH.i18n.json b/i18n/de-CH.i18n.json index 107d5b1e8..d1b3dbbd1 100644 --- a/i18n/de-CH.i18n.json +++ b/i18n/de-CH.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Board nach Excel exportieren", "user-can-not-export-excel": "Benutzer kann nicht nach Excel exportieren", "export-board-html": "Board als HTML exportieren", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Board exportieren", + "exportCardPopup-title": "Export card", "sort": "Sortieren", "sort-desc": "Zum Sortieren der Liste klicken", "list-sort-by": "Sortieren der Liste nach:", diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json index 72ead4bfd..21ce7e0cd 100644 --- a/i18n/de.i18n.json +++ b/i18n/de.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Board nach Excel exportieren", "user-can-not-export-excel": "Benutzer kann nicht nach Excel exportieren", "export-board-html": "Board als HTML exportieren", + "export-card": "Karte exportieren", + "export-card-pdf": "Karte in ein PDF exportieren", + "user-can-not-export-card-to-pdf": "Benutzer kann Karte nicht in ein PDF exportieren", "exportBoardPopup-title": "Board exportieren", + "exportCardPopup-title": "Karte exportieren", "sort": "Sortieren", "sort-desc": "Zum Sortieren der Liste klicken", "list-sort-by": "Sortieren der Liste nach:", diff --git a/i18n/el.i18n.json b/i18n/el.i18n.json index 61e1245ba..abfa68508 100644 --- a/i18n/el.i18n.json +++ b/i18n/el.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Εξαγωγή πίνακα σε Excel", "user-can-not-export-excel": "Ο χρήστης δε μπορεί να εξάγει σε Excel", "export-board-html": "Εξαγωγή πίνακα σε HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Εξαγωγή πίνακα", + "exportCardPopup-title": "Export card", "sort": "Ταξινόμηση", "sort-desc": "Κάντε κλικ για να ταξινομήστε τη λίστα", "list-sort-by": "Ταξινόμηση λίστας βάσει:", diff --git a/i18n/en-GB.i18n.json b/i18n/en-GB.i18n.json index 3226df027..af2a7d2e3 100644 --- a/i18n/en-GB.i18n.json +++ b/i18n/en-GB.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/eo.i18n.json b/i18n/eo.i18n.json index 292015629..44f06172f 100644 --- a/i18n/eo.i18n.json +++ b/i18n/eo.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/es-AR.i18n.json b/i18n/es-AR.i18n.json index fa357e9c4..4a101c341 100644 --- a/i18n/es-AR.i18n.json +++ b/i18n/es-AR.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Exportar tablero", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/es-CL.i18n.json b/i18n/es-CL.i18n.json index 0b4b62eb7..3513423fd 100644 --- a/i18n/es-CL.i18n.json +++ b/i18n/es-CL.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Exportar el tablero", + "exportCardPopup-title": "Export card", "sort": "Ordenar", "sort-desc": "Click para ordenar la lista", "list-sort-by": "Ordenar la lista por:", diff --git a/i18n/es-LA.i18n.json b/i18n/es-LA.i18n.json index 676e8960b..657defbaf 100644 --- a/i18n/es-LA.i18n.json +++ b/i18n/es-LA.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/es-MX.i18n.json b/i18n/es-MX.i18n.json index 03944c6f8..3222a6c0a 100644 --- a/i18n/es-MX.i18n.json +++ b/i18n/es-MX.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/es-PE.i18n.json b/i18n/es-PE.i18n.json index 4bc921929..09f4482c5 100644 --- a/i18n/es-PE.i18n.json +++ b/i18n/es-PE.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Exportar tablero a HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Exportar tablero", + "exportCardPopup-title": "Export card", "sort": "Ordenar", "sort-desc": "Clic para ordenar lista", "list-sort-by": "Ordenar la lista por:", diff --git a/i18n/es-PY.i18n.json b/i18n/es-PY.i18n.json index 676e8960b..657defbaf 100644 --- a/i18n/es-PY.i18n.json +++ b/i18n/es-PY.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/es.i18n.json b/i18n/es.i18n.json index 21b777e38..416d7980f 100644 --- a/i18n/es.i18n.json +++ b/i18n/es.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Exportar tablero a Excel", "user-can-not-export-excel": "El usuario no puede exportar Excel", "export-board-html": "Exportar tablero a HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Exportar el tablero", + "exportCardPopup-title": "Export card", "sort": "Ordenar", "sort-desc": "Click para ordenar la lista", "list-sort-by": "Ordenar la lista por:", diff --git a/i18n/eu.i18n.json b/i18n/eu.i18n.json index 714127f9f..65427fb81 100644 --- a/i18n/eu.i18n.json +++ b/i18n/eu.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Esportatu arbela", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/fa-IR.i18n.json b/i18n/fa-IR.i18n.json index 05c949939..6788a20a1 100644 --- a/i18n/fa-IR.i18n.json +++ b/i18n/fa-IR.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/fa.i18n.json b/i18n/fa.i18n.json index a4cc18674..7b5aa3033 100644 --- a/i18n/fa.i18n.json +++ b/i18n/fa.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "خروجی برد به اکسل", "user-can-not-export-excel": "کاربر قادر به گرفتن خروجی اکسلب نیست", "export-board-html": "اکسپورت برد به HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "انتقال به بیرون برد", + "exportCardPopup-title": "Export card", "sort": "مرتب سازی", "sort-desc": "برای مرتب سازی لیست کلیک کنید", "list-sort-by": "مرتب سازی لیست بر اساس:", diff --git a/i18n/fi.i18n.json b/i18n/fi.i18n.json index 7747282c8..1b2953678 100644 --- a/i18n/fi.i18n.json +++ b/i18n/fi.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Vie taulu Excel", "user-can-not-export-excel": "Käyttäjä ei voi viedä Excel tiedostoon", "export-board-html": "Vie taulu HTML", + "export-card": "Vie kortti", + "export-card-pdf": "Vie kortti PDF", + "user-can-not-export-card-to-pdf": "Käyttäjä ei voi viedä korttia PDF tiedostoon", "exportBoardPopup-title": "Vie taulu", + "exportCardPopup-title": "Vie kortti", "sort": "Lajittele", "sort-desc": "Klikkaa lajitellaksesi listan", "list-sort-by": "Lajittele lista:", diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json index f5d00fcc4..33e0fe020 100644 --- a/i18n/fr.i18n.json +++ b/i18n/fr.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Exporter le tableau vers Excel", "user-can-not-export-excel": "L'utilisateur ne peut pas exporter vers Excel", "export-board-html": "Exporter le tableau en HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Exporter le tableau", + "exportCardPopup-title": "Export card", "sort": "Tri", "sort-desc": "Cliquez pour trier la liste", "list-sort-by": "Trier la liste par:", diff --git a/i18n/gl.i18n.json b/i18n/gl.i18n.json index 8d24c99ba..3e9b54d5f 100644 --- a/i18n/gl.i18n.json +++ b/i18n/gl.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Exportar taboleiro", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/he.i18n.json b/i18n/he.i18n.json index fc41dc514..bbcc1536b 100644 --- a/i18n/he.i18n.json +++ b/i18n/he.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "ייצוא לוח ל־Excel", "user-can-not-export-excel": "המשתמש לא יכול לייצא ל־Excel", "export-board-html": "ייצוא לוח ל־HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "ייצוא לוח", + "exportCardPopup-title": "Export card", "sort": "מיון", "sort-desc": "לחיצה למיון הרשימה", "list-sort-by": "מיון הרשימה לפי:", diff --git a/i18n/hi.i18n.json b/i18n/hi.i18n.json index e26aef204..263553622 100644 --- a/i18n/hi.i18n.json +++ b/i18n/hi.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "HTML को निर्यात बोर्ड", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export बोर्ड", + "exportCardPopup-title": "Export card", "sort": "भांति", "sort-desc": "क्रमबद्ध सूची पर क्लिक करें", "list-sort-by": "सूची क्रमबद्ध करें:", diff --git a/i18n/hr.i18n.json b/i18n/hr.i18n.json index b3ada69d6..1d3b1e376 100644 --- a/i18n/hr.i18n.json +++ b/i18n/hr.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/hu.i18n.json b/i18n/hu.i18n.json index 4b8bdc184..20b03e9eb 100644 --- a/i18n/hu.i18n.json +++ b/i18n/hu.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Exportáld a Táblát Excelbe", "user-can-not-export-excel": "Felhasználó nem tud Excelbe exportálni", "export-board-html": "Exportáld a táblát HTML (webes) formátumba", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Tábla exportálása", + "exportCardPopup-title": "Export card", "sort": "Rendezés", "sort-desc": "Kattints a lista rendezéséhez", "list-sort-by": "Rendezd a Listát e szerint:", diff --git a/i18n/hy.i18n.json b/i18n/hy.i18n.json index 265a3461a..a582f9531 100644 --- a/i18n/hy.i18n.json +++ b/i18n/hy.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/id.i18n.json b/i18n/id.i18n.json index 7020eddc6..6bebf0bc3 100644 --- a/i18n/id.i18n.json +++ b/i18n/id.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Exspor Panel", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/ig.i18n.json b/i18n/ig.i18n.json index 72e065a98..692bbd7a1 100644 --- a/i18n/ig.i18n.json +++ b/i18n/ig.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json index e3c2a464b..b41a159fe 100644 --- a/i18n/it.i18n.json +++ b/i18n/it.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Esporta bacheca in Excel", "user-can-not-export-excel": "L'utente non può effettuare l'esportazione in Excel", "export-board-html": "Esporta bacheca in HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Esporta bacheca", + "exportCardPopup-title": "Export card", "sort": "Ordina", "sort-desc": "Clicca per ordinare la lista", "list-sort-by": "Ordina lista per:", diff --git a/i18n/ja.i18n.json b/i18n/ja.i18n.json index a1691587a..291f8f1ba 100644 --- a/i18n/ja.i18n.json +++ b/i18n/ja.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "ボードをExcelにエクスポート", "user-can-not-export-excel": "ユーザーはExcelにエクスポートできません ", "export-board-html": "ボードをHTMLにエクスポート", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "ボードのエクスポート", + "exportCardPopup-title": "Export card", "sort": "並べ替え", "sort-desc": "クリックでリストをソート", "list-sort-by": "次によりリストを並べ替え:", diff --git a/i18n/ka.i18n.json b/i18n/ka.i18n.json index 809fcc407..92c470a50 100644 --- a/i18n/ka.i18n.json +++ b/i18n/ka.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "დაფის ექსპორტი", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/km.i18n.json b/i18n/km.i18n.json index dfee25c17..7fb57c43c 100644 --- a/i18n/km.i18n.json +++ b/i18n/km.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/ko.i18n.json b/i18n/ko.i18n.json index 8ce9d0a02..b000f6ee0 100644 --- a/i18n/ko.i18n.json +++ b/i18n/ko.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "보드 내보내기", + "exportCardPopup-title": "Export card", "sort": "분류", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/lt.i18n.json b/i18n/lt.i18n.json index 676e8960b..657defbaf 100644 --- a/i18n/lt.i18n.json +++ b/i18n/lt.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/lv.i18n.json b/i18n/lv.i18n.json index 4dfb289e0..0509fef5b 100644 --- a/i18n/lv.i18n.json +++ b/i18n/lv.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Eksportēt dēli kā HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Eksportēt dēli", + "exportCardPopup-title": "Export card", "sort": "Kārtot", "sort-desc": "Spiediet, lai kārtotu sarakstu", "list-sort-by": "Kārtot sarakstu pēc:", diff --git a/i18n/mk.i18n.json b/i18n/mk.i18n.json index 124837d7b..e26d5e93d 100644 --- a/i18n/mk.i18n.json +++ b/i18n/mk.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Експортиране на Табло", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/mn.i18n.json b/i18n/mn.i18n.json index 197d289e5..b5135656d 100644 --- a/i18n/mn.i18n.json +++ b/i18n/mn.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/nb.i18n.json b/i18n/nb.i18n.json index e6faf64e0..418fe6182 100644 --- a/i18n/nb.i18n.json +++ b/i18n/nb.i18n.json @@ -82,8 +82,8 @@ "add-attachment": "Legg til Vedlegg", "add-board": "Legg til Tavle", "add-card": "Legg til Kort", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-card-to-top-of-list": "Legg til Kort på Toppen av Listen", + "add-card-to-bottom-of-list": "Legg til Kort på Bunnen av Listen", "add-swimlane": "Legg til Svømmebane", "add-subtask": "Legg til Underoppgave", "add-checklist": "Legg til Sjekkliste", @@ -133,7 +133,7 @@ "board-not-found": "Kunne ikke finne tavlen", "board-private-info": "Denne tavlen vil være privat.", "board-public-info": "Denne tavlen vil være offentlig.", - "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "board-drag-drop-reorder-or-click-open": "Klikk og Dra for å omorganisere ikoner på tavlen. Klikk på ikon for å åpne tavlen.", "boardChangeColorPopup-title": "Ende tavlens bakgrunnsfarge", "boardChangeTitlePopup-title": "Endre navn på tavlen", "boardChangeVisibilityPopup-title": "Endre synlighet", @@ -181,10 +181,10 @@ "vote-against": "mot", "deleteVotePopup-title": "Slett stemme?", "vote-delete-pop": "Sletting er permanent. Du vil miste alle aksjoner som har en sammenheng med denne stemmen.", - "cardStartPlanningPokerPopup-title": "Start a Planning Poker", - "card-edit-planning-poker": "Edit Planning Poker", - "editPokerEndDatePopup-title": "Change Planning Poker vote end date", - "poker-question": "Planning Poker", + "cardStartPlanningPokerPopup-title": "Start en Planpeker", + "card-edit-planning-poker": "Endre en Planpeker", + "editPokerEndDatePopup-title": "Endre Stemming og Dato for Planpeker ", + "poker-question": "Planpeker", "poker-one": "1", "poker-two": "2", "poker-three": "3", @@ -195,13 +195,13 @@ "poker-forty": "40", "poker-oneHundred": "100", "poker-unsure": "?", - "poker-finish": "Finish", - "poker-result-votes": "Votes", - "poker-result-who": "Who", - "poker-replay": "Replay", - "set-estimation": "Set Estimation", - "deletePokerPopup-title": "Delete planning poker?", - "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "poker-finish": "Ferdig", + "poker-result-votes": "Stemmer", + "poker-result-who": "Hvem", + "poker-replay": "Spill på nytt", + "set-estimation": "Angi Estimat", + "deletePokerPopup-title": "Slett Planpeker", + "poker-delete-pop": "Sletting er permanent. Du vil miste alle aksjoner som er assosiert med denne planpekeren.", "cardDeletePopup-title": "Slett kort?", "cardDetailsActionsPopup-title": "Kort-handlinger", "cardLabelsPopup-title": "Etiketter", @@ -233,7 +233,7 @@ "close": "Lukk", "close-board": "Lukk Tavle", "close-board-pop": "Du vil ha muligheten til å gjenopprette Tavle ved å klikke på 'Arkiv'-knappen i hjem-menyen.", - "close-card": "Close Card", + "close-card": "Lukk Kort", "color-black": "svart", "color-blue": "blå", "color-crimson": "høyrød", @@ -358,7 +358,11 @@ "export-board-excel": "Eksporter Tavle til Excel", "user-can-not-export-excel": "Bruker kan ikke eksportere til Excel", "export-board-html": "Eksporter tavle til HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Eksporter tavle", + "exportCardPopup-title": "Export card", "sort": "Sorter", "sort-desc": "Klikk for sortering liste", "list-sort-by": "Sorter liten etter:", @@ -447,8 +451,8 @@ "set-color-list": "Sett farge", "listActionPopup-title": "List aksjoner", "settingsUserPopup-title": "Brukerinnstillinger", - "settingsTeamPopup-title": "Team Settings", - "settingsOrgPopup-title": "Organization Settings", + "settingsTeamPopup-title": "Innstillinger Team", + "settingsOrgPopup-title": "Innstillinger Organisasjon", "swimlaneActionPopup-title": "Svømmebane-aksjoner", "swimlaneAddPopup-title": "Legg til en Svømmebane under", "listImportCardPopup-title": "Importer et Trello-kort", @@ -664,7 +668,7 @@ "setListColorPopup-title": "Velg en farge", "assigned-by": "Tildelt av", "requested-by": "Forespurt av", - "card-sorting-by-number": "Card sorting by number", + "card-sorting-by-number": "Kort sorter etter nummer", "board-delete-notice": "Sletting er permanent. Du vil miste alle lister, kort og aksjoner assosiert med denne tavlen,", "delete-board-confirm-popup": "Alle lister, kort, etiketter og aktiviteter vil bli slettet og du vil ikke kunne gjenopprette innholdet på tavlen. Det er ikke mulig å angre.", "boardDeletePopup-title": "Slett Tavle?", @@ -846,8 +850,8 @@ "act-duenow": "minnet om at nåværende forfallstid (__timeValue__) for __card__ er nå", "act-atUserComment": "Du ble nevnt i [__board__] __list__/__card__", "delete-user-confirm-popup": "Er du sikker på at du vil slette denne kontoen?", - "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", - "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "delete-team-confirm-popup": "Er du sikker på at du vil slette Teamet? Du kan ikke angre.", + "delete-org-confirm-popup": "Er du sikker på at du vil slette denne Organisasjonen? Du kan ikke angre.", "accounts-allowUserDelete": "Tillat brukere å slette egen konto", "hide-minicard-label-text": "Skjul tekst på etikett", "show-desktop-drag-handles": "Vis ikon for flytting av kort", @@ -1038,16 +1042,16 @@ "rulesReportTitle": "Rapportering Regler", "copy-swimlane": "Kopiér Svømmebane", "copySwimlanePopup-title": "Kopiér Svømmebane", - "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner", - "Bounce": "Bounce Wait Spinner", - "Cube": "Cube Wait Spinner", - "Cube-Grid": "Cube-Grid Wait Spinner", - "Dot": "Dot Wait Spinner", - "Double-Bounce": "Double Bounce Wait Spinner", - "Rotateplane": "Rotateplane Wait Spinner", - "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner", - "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" + "display-card-creator": "Vis etablerer av Kort", + "wait-spinner": "Ventehjul", + "Bounce": "Ventehjul - Hoppende", + "Cube": "Ventehjul - Kubisk", + "Cube-Grid": "Ventehjul - Kubisk med akser", + "Dot": "Ventehjul - Prikk", + "Double-Bounce": "Ventehjul - Dobbelt - Hoppende", + "Rotateplane": "Ventehjul - Rotasjonsplan", + "Scaleout": "Ventehjul - Utskaliering", + "Wave": "Ventehjul - Bølge", + "maximize-card": "Maksimer Kort", + "minimize-card": "Minimer Kort" } \ No newline at end of file diff --git a/i18n/nl.i18n.json b/i18n/nl.i18n.json index 1b6d5e943..db298970f 100644 --- a/i18n/nl.i18n.json +++ b/i18n/nl.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Exporteer bord naar Excel", "user-can-not-export-excel": "Gebruiker kan niet exporteren naar Excel", "export-board-html": "Exporteer bord naar HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Exporteer bord", + "exportCardPopup-title": "Export card", "sort": "Sorteer", "sort-desc": "Klik om lijst te sorteren", "list-sort-by": "Sorteer lijst op", diff --git a/i18n/oc.i18n.json b/i18n/oc.i18n.json index 6a16cde18..99f80ad72 100644 --- a/i18n/oc.i18n.json +++ b/i18n/oc.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Exportar lo tablèu", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/pa.i18n.json b/i18n/pa.i18n.json index 676e8960b..657defbaf 100644 --- a/i18n/pa.i18n.json +++ b/i18n/pa.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/pl.i18n.json b/i18n/pl.i18n.json index 6b27e7eda..85e37d3fb 100644 --- a/i18n/pl.i18n.json +++ b/i18n/pl.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Eksportuj tablicę w formacie Excel", "user-can-not-export-excel": "Użytkownik nie może wyeksportować tablicy w formacie Excel", "export-board-html": "Eksportuj tablicę do HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Eksportuj tablicę", + "exportCardPopup-title": "Export card", "sort": "Sortuj", "sort-desc": "Kliknij by sortować listę", "list-sort-by": "Sortuj listę przez:", diff --git a/i18n/pt-BR.i18n.json b/i18n/pt-BR.i18n.json index d258b86f6..96813cb28 100644 --- a/i18n/pt-BR.i18n.json +++ b/i18n/pt-BR.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Exportar quadro para Excel", "user-can-not-export-excel": "Usuário não pode exportar Excel", "export-board-html": "Exportar quadro para HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Exportar quadro", + "exportCardPopup-title": "Export card", "sort": "Ordenar", "sort-desc": "Clique para Ordenar Lista", "list-sort-by": "Ordenar a Lista por:", diff --git a/i18n/pt.i18n.json b/i18n/pt.i18n.json index 314fed59d..84b301242 100644 --- a/i18n/pt.i18n.json +++ b/i18n/pt.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Exportar quadro para Excel", "user-can-not-export-excel": "Utilizador não pode exportar Excel", "export-board-html": "Exportar quadro para HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Exportar quadro", + "exportCardPopup-title": "Export card", "sort": "Ordenar", "sort-desc": "Clique para ordenar a Lista", "list-sort-by": "Ordenar a Lista por:", diff --git a/i18n/ro.i18n.json b/i18n/ro.i18n.json index 4dfbe6560..3c0a44dc5 100644 --- a/i18n/ro.i18n.json +++ b/i18n/ro.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/ru.i18n.json b/i18n/ru.i18n.json index ccc48ee73..65deedac1 100644 --- a/i18n/ru.i18n.json +++ b/i18n/ru.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Экспортировать доску в Excel", "user-can-not-export-excel": "Пользователь не может экспортировать в Excel", "export-board-html": "Экспортировать доску в HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Экспортировать доску", + "exportCardPopup-title": "Export card", "sort": "Сортировать", "sort-desc": "Нажмите, чтобы отсортировать список", "list-sort-by": "Сортировать список по:", diff --git a/i18n/sk.i18n.json b/i18n/sk.i18n.json index c6abb8f0a..e2d83bf28 100644 --- a/i18n/sk.i18n.json +++ b/i18n/sk.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/sl.i18n.json b/i18n/sl.i18n.json index 81bb3bdc0..7e6064918 100644 --- a/i18n/sl.i18n.json +++ b/i18n/sl.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Izvozi tablo", + "exportCardPopup-title": "Export card", "sort": "Sortiraj", "sort-desc": "Klikni za sortiranje seznama", "list-sort-by": "Sortiraj po:", diff --git a/i18n/sr.i18n.json b/i18n/sr.i18n.json index 13595314d..4f0d9b6d5 100644 --- a/i18n/sr.i18n.json +++ b/i18n/sr.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sortiraj", "sort-desc": "Kliknite da biste sortirali listu", "list-sort-by": "Poredaj listu po:", diff --git a/i18n/sv.i18n.json b/i18n/sv.i18n.json index f86cf3d86..7b99b9352 100644 --- a/i18n/sv.i18n.json +++ b/i18n/sv.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Exportera tavla till Excel", "user-can-not-export-excel": "Användare kan inte exportera till Excel", "export-board-html": "Exportera tavla till HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Exportera tavla", + "exportCardPopup-title": "Export card", "sort": "Sortera", "sort-desc": "Klicka för att sortera listan", "list-sort-by": "Sortera listan efter:", diff --git a/i18n/sw.i18n.json b/i18n/sw.i18n.json index 536e47a36..6100ba4ee 100644 --- a/i18n/sw.i18n.json +++ b/i18n/sw.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/ta.i18n.json b/i18n/ta.i18n.json index 46c1ee8cf..cf54d830f 100644 --- a/i18n/ta.i18n.json +++ b/i18n/ta.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/th.i18n.json b/i18n/th.i18n.json index b5117f119..295490dc5 100644 --- a/i18n/th.i18n.json +++ b/i18n/th.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "ส่งออกกระดาน", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/tr.i18n.json b/i18n/tr.i18n.json index e9210e989..b44dc8002 100644 --- a/i18n/tr.i18n.json +++ b/i18n/tr.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Panoyu HTML olarak dışarı aktar", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Panoyu dışarı aktar", + "exportCardPopup-title": "Export card", "sort": "Sırala", "sort-desc": "Listeyi Sıralamak için Tıklayın", "list-sort-by": "Listeyi Sırala:", diff --git a/i18n/uk.i18n.json b/i18n/uk.i18n.json index e1f4cd38b..2d9fdcc9d 100644 --- a/i18n/uk.i18n.json +++ b/i18n/uk.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/vi.i18n.json b/i18n/vi.i18n.json index b8889d08e..43da1e121 100644 --- a/i18n/vi.i18n.json +++ b/i18n/vi.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Xuất bảng sang Excel", "user-can-not-export-excel": "Người dùng không thể xuất Excel", "export-board-html": "Xuất bảng sang HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Xuất bảng", + "exportCardPopup-title": "Export card", "sort": "Sắp xếp", "sort-desc": "Nhấp để sắp xếp danh sách", "list-sort-by": "Sắp xếp Danh sách bởi:", diff --git a/i18n/zh-CN.i18n.json b/i18n/zh-CN.i18n.json index 476e54f86..512c8525a 100644 --- a/i18n/zh-CN.i18n.json +++ b/i18n/zh-CN.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "看板导出为Excel", "user-can-not-export-excel": "用户无法导出Excel", "export-board-html": "看板导出为HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "导出看板", + "exportCardPopup-title": "Export card", "sort": "排序", "sort-desc": "点此来将列表排序", "list-sort-by": "按此来将列表排序:", diff --git a/i18n/zh-HK.i18n.json b/i18n/zh-HK.i18n.json index 6eb151c0c..8c75d1ec8 100644 --- a/i18n/zh-HK.i18n.json +++ b/i18n/zh-HK.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "Export board to Excel", "user-can-not-export-excel": "User can not export Excel", "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", "sort": "Sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", diff --git a/i18n/zh-TW.i18n.json b/i18n/zh-TW.i18n.json index 7b13d98d2..a99319d35 100644 --- a/i18n/zh-TW.i18n.json +++ b/i18n/zh-TW.i18n.json @@ -358,7 +358,11 @@ "export-board-excel": "匯出看板至 Excel", "user-can-not-export-excel": "使用者無法匯出至 Excel", "export-board-html": "匯出看板為HTML格式\n ", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "匯出看板", + "exportCardPopup-title": "Export card", "sort": "排序", "sort-desc": "點選排序清單", "list-sort-by": "清單排序依照:", From 17acf1884850d8d95ae79493289adf18966df652 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 12 Jun 2021 15:15:36 +0300 Subject: [PATCH 66/81] Export card to PDF. Part 2. Thanks to xet7 ! --- client/components/cards/cardDetails.jade | 94 ++++++++++++------------ 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade index 3ace94150..4aabf2eed 100644 --- a/client/components/cards/cardDetails.jade +++ b/client/components/cards/cardDetails.jade @@ -576,9 +576,9 @@ template(name="cardDetailsActionsPopup") else i.fa.fa-eye-slash | {{_ 'watch'}} + hr if canModifyCard unless currentUser.isWorker - hr ul.pop-over-list //li: a.js-members {{_ 'card-edit-members'}} //li: a.js-labels {{_ 'card-edit-labels'}} @@ -608,58 +608,58 @@ template(name="cardDetailsActionsPopup") a.js-set-card-color i.fa.fa-paint-brush | {{_ 'setCardColorPopup-title'}} - hr - ul.pop-over-list + hr + ul.pop-over-list + li + a.js-export-card + i.fa.fa-share-alt + | {{_ 'export-card'}} + hr + ul.pop-over-list + li + a.js-move-card-to-top + i.fa.fa-arrow-up + | {{_ 'moveCardToTop-title'}} + li + a.js-move-card-to-bottom + i.fa.fa-arrow-down + | {{_ 'moveCardToBottom-title'}} + hr + ul.pop-over-list + if currentUser.isBoardAdmin li - a.js-export-card - i.fa.fa-share-alt - | {{_ 'export-card'}} - hr - ul.pop-over-list - li - a.js-move-card-to-top - i.fa.fa-arrow-up - | {{_ 'moveCardToTop-title'}} - li - a.js-move-card-to-bottom - i.fa.fa-arrow-down - | {{_ 'moveCardToBottom-title'}} - hr - ul.pop-over-list - if currentUser.isBoardAdmin - li - a.js-move-card - i.fa.fa-arrow-right - | {{_ 'moveCardPopup-title'}} - unless currentUser.isWorker - li - a.js-copy-card - i.fa.fa-copy - | {{_ 'copyCardPopup-title'}} + a.js-move-card + i.fa.fa-arrow-right + | {{_ 'moveCardPopup-title'}} unless currentUser.isWorker + li + a.js-copy-card + i.fa.fa-copy + | {{_ 'copyCardPopup-title'}} + unless currentUser.isWorker + hr + ul.pop-over-list + li + a.js-copy-checklist-cards + i.fa.fa-list + i.fa.fa-copy + | {{_ 'copyChecklistToManyCardsPopup-title'}} + unless archived hr ul.pop-over-list li - a.js-copy-checklist-cards - i.fa.fa-list - i.fa.fa-copy - | {{_ 'copyChecklistToManyCardsPopup-title'}} - unless archived - hr - ul.pop-over-list - li - a.js-archive - i.fa.fa-arrow-right - i.fa.fa-archive - | {{_ 'archive-card'}} - hr - ul.pop-over-list - li - a.js-more - i.fa.fa-link - | {{_ 'cardMorePopup-title'}} + a.js-archive + i.fa.fa-arrow-right + i.fa.fa-archive + | {{_ 'archive-card'}} + hr + ul.pop-over-list + li + a.js-more + i.fa.fa-link + | {{_ 'cardMorePopup-title'}} -template(name="exportCard") +template(name="exportCardPopup") ul.pop-over-list li a(href="{{exportUrlCardPDF}}",, download="{{exportFilenameCardPDF}}") From b1f07149c00c28b0bac8e9c6b460f19fd4a1cdc3 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 12 Jun 2021 15:16:38 +0300 Subject: [PATCH 67/81] Updated ChangeLog. --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93f771106..3b4c9c03e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,9 @@ This release adds the following new features: Thanks to xet7. - [Maximize Card. In Progress](https://github.com/wekan/wekan/commit/8c572502436a2eb22bd1eb1e4069c1c9145e2070). Thanks to xet7. -- [Export Card to PDF. In Progress](https://github.com/wekan/wekan/commit/a2f2ce11354a8dbfdd6759e3b65797e4be4cc6ec). +- Export Card to PDF. In Progress. + [Part 1](https://github.com/wekan/wekan/commit/a2f2ce11354a8dbfdd6759e3b65797e4be4cc6ec), + [Part 2](https://github.com/wekan/wekan/commit/17acf1884850d8d95ae79493289adf18966df652). Thanks to xet7. and adds the following improvements: From 8f19f043a1e5ce80242f4b9bd895edbeb26cdb8d Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 12 Jun 2021 15:19:20 +0300 Subject: [PATCH 68/81] Updated translations. --- i18n/cs.i18n.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/i18n/cs.i18n.json b/i18n/cs.i18n.json index bb71a8acc..252f0759f 100644 --- a/i18n/cs.i18n.json +++ b/i18n/cs.i18n.json @@ -358,11 +358,11 @@ "export-board-excel": "Exportovat tablo do Excelu", "user-can-not-export-excel": "Uživatel nemůže exportovat do Excelu", "export-board-html": "Exportovat tablo do HTML", - "export-card": "Export card", - "export-card-pdf": "Export card to PDF", - "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "export-card": "Exportovat kartu", + "export-card-pdf": "Exportovat kartu do PDF", + "user-can-not-export-card-to-pdf": "Uživatel nemůže exportovat kartu do PDF", "exportBoardPopup-title": "Exportovat tablo", - "exportCardPopup-title": "Export card", + "exportCardPopup-title": "Exportovat kartu", "sort": "řadit", "sort-desc": "Kliknout pro třídění seznamu", "list-sort-by": "řadit seznam podle", From 23e5e1e3bd081699ce39ce5887db7e612616014d Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 12 Jun 2021 23:28:57 +0300 Subject: [PATCH 69/81] Reduced Wekan bundle size from 636 MB to 467 MB by deleting all dependencies of lucasantoniassi:accounts-lockout and including only required 10 files. Thank to xet7 ! --- .meteor/packages | 2 +- .meteor/versions | 2 +- .../wekan-accounts-lockout/CONTRIBUTING.md | 25 ++ packages/wekan-accounts-lockout/LICENSE | 21 ++ packages/wekan-accounts-lockout/README.md | 126 +++++++ .../accounts-lockout.js | 5 + packages/wekan-accounts-lockout/package.js | 18 + packages/wekan-accounts-lockout/package.json | 4 + .../src/accountsLockout.js | 29 ++ .../src/accountsLockoutCollection.js | 3 + .../wekan-accounts-lockout/src/knownUser.js | 321 +++++++++++++++++ .../wekan-accounts-lockout/src/unknownUser.js | 329 ++++++++++++++++++ server/accounts-lockout.js | 45 +-- 13 files changed, 908 insertions(+), 22 deletions(-) create mode 100644 packages/wekan-accounts-lockout/CONTRIBUTING.md create mode 100644 packages/wekan-accounts-lockout/LICENSE create mode 100644 packages/wekan-accounts-lockout/README.md create mode 100644 packages/wekan-accounts-lockout/accounts-lockout.js create mode 100644 packages/wekan-accounts-lockout/package.js create mode 100644 packages/wekan-accounts-lockout/package.json create mode 100644 packages/wekan-accounts-lockout/src/accountsLockout.js create mode 100644 packages/wekan-accounts-lockout/src/accountsLockoutCollection.js create mode 100644 packages/wekan-accounts-lockout/src/knownUser.js create mode 100644 packages/wekan-accounts-lockout/src/unknownUser.js diff --git a/.meteor/packages b/.meteor/packages index 5cc6f9ff6..10ddbb158 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -83,7 +83,6 @@ mquandalle:moment msavin:usercache # Keep stylus in 1.1.0, because building v2 takes extra 52 minutes. coagmano:stylus@1.1.0! -lucasantoniassi:accounts-lockout meteorhacks:subs-manager meteorhacks:picker lamhieu:unblock @@ -145,3 +144,4 @@ staringatlights:fast-render spacebars easylogic:summernote pascoual:pdfkit +wekan-accounts-lockout diff --git a/.meteor/versions b/.meteor/versions index 4e8ad77ee..c61075b8a 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -71,7 +71,6 @@ launch-screen@1.2.1 livedata@1.0.18 localstorage@1.2.0 logging@1.2.0 -lucasantoniassi:accounts-lockout@1.0.0 matb33:collection-hooks@0.9.1 matteodem:easy-search@1.6.4 mdg:validation-error@0.5.1 @@ -220,6 +219,7 @@ verron:autosize@3.0.8 webapp@1.10.1 webapp-hashing@1.1.0 wekan-accounts-cas@0.1.0 +wekan-accounts-lockout@1.0.0 wekan-accounts-oidc@1.0.10 wekan-cfs-access-point@0.1.50 wekan-cfs-base-package@0.0.30 diff --git a/packages/wekan-accounts-lockout/CONTRIBUTING.md b/packages/wekan-accounts-lockout/CONTRIBUTING.md new file mode 100644 index 000000000..c72e88f69 --- /dev/null +++ b/packages/wekan-accounts-lockout/CONTRIBUTING.md @@ -0,0 +1,25 @@ +# Contributing guide + +Want to contribute to Accounts-Lockout? Awesome! +There are many ways you can contribute, see below. + +## Opening issues + +Open an issue to report bugs or to propose new features. + +- Reporting bugs: describe the bug as clearly as you can, including steps to reproduce, what happened and what you were expecting to happen. Also include browser version, OS and other related software's (npm, Node.js, etc) versions when applicable. + +- Proposing features: explain the proposed feature, what it should do, why it is useful, how users should use it. Give us as much info as possible so it will be easier to discuss, access and implement the proposed feature. When you're unsure about a certain aspect of the feature, feel free to leave it open for others to discuss and find an appropriate solution. + +## Proposing pull requests + +Pull requests are very welcome. Note that if you are going to propose drastic changes, be sure to open an issue for discussion first, to make sure that your PR will be accepted before you spend effort coding it. + +Fork the Accounts-Lockout repository, clone it locally and create a branch for your proposed bug fix or new feature. Avoid working directly on the master branch. + +Implement your bug fix or feature, write tests to cover it and make sure all tests are passing (run a final `npm test` to make sure everything is correct). Then commit your changes, push your bug fix/feature branch to the origin (your forked repo) and open a pull request to the upstream (the repository you originally forked)'s master branch. + +## Documentation + +Documentation is extremely important and takes a fair deal of time and effort to write and keep updated. +Please submit any and all improvements you can make to the repository's docs. diff --git a/packages/wekan-accounts-lockout/LICENSE b/packages/wekan-accounts-lockout/LICENSE new file mode 100644 index 000000000..a5298594c --- /dev/null +++ b/packages/wekan-accounts-lockout/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Lucas Antoniassi de Paiva + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/wekan-accounts-lockout/README.md b/packages/wekan-accounts-lockout/README.md new file mode 100644 index 000000000..8d9c6897c --- /dev/null +++ b/packages/wekan-accounts-lockout/README.md @@ -0,0 +1,126 @@ +# Meteor - Accounts - Lockout + +[![Build Status](https://travis-ci.org/LucasAntoniassi/meteor-accounts-lockout.svg?branch=master)](https://travis-ci.org/LucasAntoniassi/meteor-accounts-lockout) +[![Codacy Badge](https://api.codacy.com/project/badge/Grade/8ce60fa7e2c24891b9bdfc3b65433d23)](https://www.codacy.com/app/lucasantoniassi/meteor-accounts-lockout?utm_source=github.com&utm_medium=referral&utm_content=LucasAntoniassi/meteor-accounts-lockout&utm_campaign=Badge_Grade) +[![Code Climate](https://codeclimate.com/github/LucasAntoniassi/meteor-accounts-lockout/badges/gpa.svg)](https://codeclimate.com/github/LucasAntoniassi/meteor-accounts-lockout) + +## What it is + +Seamless Meteor apps accounts protection from password brute-force attacks. +Users won't notice it. Hackers shall not pass. + +![you-shall-not-pass](https://cloud.githubusercontent.com/assets/3399956/9023729/007dd2a2-38b1-11e5-807a-b81c6ce00c80.jpg) + +## Installation + +``` +meteor add lucasantoniassi:accounts-lockout +``` + +## Usage via ES6 import + +```javascript +// server +import { AccountsLockout } from 'meteor/lucasantoniassi:accounts-lockout'; +``` + +## How to use + +Default settings: + +```javascript + "knownUsers": { + "failuresBeforeLockout": 3, // positive integer greater than 0 + "lockoutPeriod": 60, // in seconds + "failureWindow": 10 // in seconds + }, + "unknownUsers": { + "failuresBeforeLockout": 3, // positive integer greater than 0 + "lockoutPeriod": 60, // in seconds + "failureWindow": 10 // in seconds + } +``` + +`knownUsers` are users where already belongs to your `Meteor.users` collections, +these rules are applied if they attempt to login with an incorrect password but a know email. + +`unknownUsers` are users where **not** belongs to your `Meteor.users` collections, +these rules are applied if they attempt to login with a unknown email. + +`failuresBeforeLockout` should be a positive integer greater than 0. + +`lockoutPeriod` should be in seconds. + +`failureWindow` should be in seconds. + +If the `default` is nice to you, you can do that. + +```javascript +(new AccountsLockout()).startup(); +``` + +You can overwrite passing an `object` as argument. + +```javascript +(new AccountsLockout({ + knownUsers: { + failuresBeforeLockout: 3, + lockoutPeriod: 60, + failureWindow: 15, + }, + unknownUsers: { + failuresBeforeLockout: 3, + lockoutPeriod: 60, + failureWindow: 15, + }, +})).startup(); +``` + +If you prefer, you can pass a `function` as argument. + +```javascript +const knownUsersRules = (user) => { + // apply some logic with this user + return { + failuresBeforeLockout, + lockoutPeriod, + failureWindow, + }; +}; + +const unknownUsersRules = (connection) => { + // apply some logic with this connection + return { + failuresBeforeLockout, + lockoutPeriod, + failureWindow, + }; +}; + +(new AccountsLockout({ + knownUsers: knownUsersRules, + unknownUsers: unknownUsersRules, +})).startup(); +``` + +If you prefer, you can use `Meteor.settings`. It will overwrite any previous case. + +```javascript +"accounts-lockout": { + "knownUsers": { + "failuresBeforeLockout": 3, + "lockoutPeriod": 60, + "failureWindow": 10 + }, + "unknownUsers": { + "failuresBeforeLockout": 3, + "lockoutPeriod": 60, + "failureWindow": 10 + } +} +``` + +## License + +This package is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT). + diff --git a/packages/wekan-accounts-lockout/accounts-lockout.js b/packages/wekan-accounts-lockout/accounts-lockout.js new file mode 100644 index 000000000..0c781c802 --- /dev/null +++ b/packages/wekan-accounts-lockout/accounts-lockout.js @@ -0,0 +1,5 @@ +import AccountsLockout from './src/accountsLockout'; + +const Name = 'wekan-accounts-lockout'; + +export { Name, AccountsLockout }; diff --git a/packages/wekan-accounts-lockout/package.js b/packages/wekan-accounts-lockout/package.js new file mode 100644 index 000000000..e2bda76a6 --- /dev/null +++ b/packages/wekan-accounts-lockout/package.js @@ -0,0 +1,18 @@ +/* global Package */ + +Package.describe({ + name: 'wekan-accounts-lockout', + version: '1.0.0', + summary: 'Meteor package for locking user accounts and stopping brute force attacks', + git: 'https://github.com/lucasantoniassi/meteor-accounts-lockout.git', + documentation: 'README.md', +}); + +Package.onUse((api) => { + api.versionsFrom('1.4.2.3'); + api.use([ + 'ecmascript', + 'accounts-password', + ]); + api.mainModule('accounts-lockout.js'); +}); diff --git a/packages/wekan-accounts-lockout/package.json b/packages/wekan-accounts-lockout/package.json new file mode 100644 index 000000000..bbff88655 --- /dev/null +++ b/packages/wekan-accounts-lockout/package.json @@ -0,0 +1,4 @@ +{ + "name": "wekan-accounts-lockout", + "private": true +} diff --git a/packages/wekan-accounts-lockout/src/accountsLockout.js b/packages/wekan-accounts-lockout/src/accountsLockout.js new file mode 100644 index 000000000..8a1f05ea1 --- /dev/null +++ b/packages/wekan-accounts-lockout/src/accountsLockout.js @@ -0,0 +1,29 @@ +import KnownUser from './knownUser'; +import UnknownUser from './unknownUser'; + +class AccountsLockout { + constructor({ + knownUsers = { + failuresBeforeLockout: 3, + lockoutPeriod: 60, + failureWindow: 15, + }, + unknownUsers = { + failuresBeforeLockout: 3, + lockoutPeriod: 60, + failureWindow: 15, + }, + }) { + this.settings = { + knownUsers, + unknownUsers, + }; + } + + startup() { + (new KnownUser(this.settings.knownUsers)).startup(); + (new UnknownUser(this.settings.unknownUsers)).startup(); + } +} + +export default AccountsLockout; diff --git a/packages/wekan-accounts-lockout/src/accountsLockoutCollection.js b/packages/wekan-accounts-lockout/src/accountsLockoutCollection.js new file mode 100644 index 000000000..9a885a0f7 --- /dev/null +++ b/packages/wekan-accounts-lockout/src/accountsLockoutCollection.js @@ -0,0 +1,3 @@ +import { Meteor } from 'meteor/meteor'; + +export default new Meteor.Collection('AccountsLockout.Connections'); diff --git a/packages/wekan-accounts-lockout/src/knownUser.js b/packages/wekan-accounts-lockout/src/knownUser.js new file mode 100644 index 000000000..81558e1b8 --- /dev/null +++ b/packages/wekan-accounts-lockout/src/knownUser.js @@ -0,0 +1,321 @@ +/* eslint-disable no-underscore-dangle */ + +import { Meteor } from 'meteor/meteor'; +import { Accounts } from 'meteor/accounts-base'; + +class KnownUser { + constructor(settings) { + this.unchangedSettings = settings; + this.settings = settings; + } + + startup() { + if (!(this.unchangedSettings instanceof Function)) { + this.updateSettings(); + } + this.scheduleUnlocksForLockedAccounts(); + KnownUser.unlockAccountsIfLockoutAlreadyExpired(); + this.hookIntoAccounts(); + } + + updateSettings() { + const settings = KnownUser.knownUsers(); + if (settings) { + settings.forEach(function updateSetting({ key, value }) { + this.settings[key] = value; + }); + } + this.validateSettings(); + } + + validateSettings() { + if ( + !this.settings.failuresBeforeLockout || + this.settings.failuresBeforeLockout < 0 + ) { + throw new Error('"failuresBeforeLockout" is not positive integer'); + } + if ( + !this.settings.lockoutPeriod || + this.settings.lockoutPeriod < 0 + ) { + throw new Error('"lockoutPeriod" is not positive integer'); + } + if ( + !this.settings.failureWindow || + this.settings.failureWindow < 0 + ) { + throw new Error('"failureWindow" is not positive integer'); + } + } + + scheduleUnlocksForLockedAccounts() { + const lockedAccountsCursor = Meteor.users.find( + { + 'services.accounts-lockout.unlockTime': { + $gt: Number(new Date()), + }, + }, + { + fields: { + 'services.accounts-lockout.unlockTime': 1, + }, + }, + ); + const currentTime = Number(new Date()); + lockedAccountsCursor.forEach((user) => { + let lockDuration = KnownUser.unlockTime(user) - currentTime; + if (lockDuration >= this.settings.lockoutPeriod) { + lockDuration = this.settings.lockoutPeriod * 1000; + } + if (lockDuration <= 1) { + lockDuration = 1; + } + Meteor.setTimeout( + KnownUser.unlockAccount.bind(null, user._id), + lockDuration, + ); + }); + } + + static unlockAccountsIfLockoutAlreadyExpired() { + const currentTime = Number(new Date()); + const query = { + 'services.accounts-lockout.unlockTime': { + $lt: currentTime, + }, + }; + const data = { + $unset: { + 'services.accounts-lockout.unlockTime': 0, + 'services.accounts-lockout.failedAttempts': 0, + }, + }; + Meteor.users.update(query, data); + } + + hookIntoAccounts() { + Accounts.validateLoginAttempt(this.validateLoginAttempt.bind(this)); + Accounts.onLogin(KnownUser.onLogin); + } + + + validateLoginAttempt(loginInfo) { + if ( + // don't interrupt non-password logins + loginInfo.type !== 'password' || + loginInfo.user === undefined || + // Don't handle errors unless they are due to incorrect password + (loginInfo.error !== undefined && loginInfo.error.reason !== 'Incorrect password') + ) { + return loginInfo.allowed; + } + + // If there was no login error and the account is NOT locked, don't interrupt + const unlockTime = KnownUser.unlockTime(loginInfo.user); + if (loginInfo.error === undefined && unlockTime === 0) { + return loginInfo.allowed; + } + + if (this.unchangedSettings instanceof Function) { + this.settings = this.unchangedSettings(loginInfo.user); + this.validateSettings(); + } + + const userId = loginInfo.user._id; + let failedAttempts = 1 + KnownUser.failedAttempts(loginInfo.user); + const firstFailedAttempt = KnownUser.firstFailedAttempt(loginInfo.user); + const currentTime = Number(new Date()); + + const canReset = (currentTime - firstFailedAttempt) > (1000 * this.settings.failureWindow); + if (canReset) { + failedAttempts = 1; + KnownUser.resetAttempts(failedAttempts, userId); + } + + const canIncrement = failedAttempts < this.settings.failuresBeforeLockout; + if (canIncrement) { + KnownUser.incrementAttempts(failedAttempts, userId); + } + + const maxAttemptsAllowed = this.settings.failuresBeforeLockout; + const attemptsRemaining = maxAttemptsAllowed - failedAttempts; + if (unlockTime > currentTime) { + let duration = unlockTime - currentTime; + duration = Math.ceil(duration / 1000); + duration = duration > 1 ? duration : 1; + KnownUser.tooManyAttempts(duration); + } + if (failedAttempts === maxAttemptsAllowed) { + this.setNewUnlockTime(failedAttempts, userId); + + let duration = this.settings.lockoutPeriod; + duration = Math.ceil(duration); + duration = duration > 1 ? duration : 1; + return KnownUser.tooManyAttempts(duration); + } + return KnownUser.incorrectPassword( + failedAttempts, + maxAttemptsAllowed, + attemptsRemaining, + ); + } + + static resetAttempts( + failedAttempts, + userId, + ) { + const currentTime = Number(new Date()); + const query = { _id: userId }; + const data = { + $set: { + 'services.accounts-lockout.failedAttempts': failedAttempts, + 'services.accounts-lockout.lastFailedAttempt': currentTime, + 'services.accounts-lockout.firstFailedAttempt': currentTime, + }, + }; + Meteor.users.update(query, data); + } + + static incrementAttempts( + failedAttempts, + userId, + ) { + const currentTime = Number(new Date()); + const query = { _id: userId }; + const data = { + $set: { + 'services.accounts-lockout.failedAttempts': failedAttempts, + 'services.accounts-lockout.lastFailedAttempt': currentTime, + }, + }; + Meteor.users.update(query, data); + } + + setNewUnlockTime( + failedAttempts, + userId, + ) { + const currentTime = Number(new Date()); + const newUnlockTime = (1000 * this.settings.lockoutPeriod) + currentTime; + const query = { _id: userId }; + const data = { + $set: { + 'services.accounts-lockout.failedAttempts': failedAttempts, + 'services.accounts-lockout.lastFailedAttempt': currentTime, + 'services.accounts-lockout.unlockTime': newUnlockTime, + }, + }; + Meteor.users.update(query, data); + Meteor.setTimeout( + KnownUser.unlockAccount.bind(null, userId), + this.settings.lockoutPeriod * 1000, + ); + } + + static onLogin(loginInfo) { + if (loginInfo.type !== 'password') { + return; + } + const userId = loginInfo.user._id; + const query = { _id: userId }; + const data = { + $unset: { + 'services.accounts-lockout.unlockTime': 0, + 'services.accounts-lockout.failedAttempts': 0, + }, + }; + Meteor.users.update(query, data); + } + + static incorrectPassword( + failedAttempts, + maxAttemptsAllowed, + attemptsRemaining, + ) { + throw new Meteor.Error( + 403, + 'Incorrect password', + JSON.stringify({ + message: 'Incorrect password', + failedAttempts, + maxAttemptsAllowed, + attemptsRemaining, + }), + ); + } + + static tooManyAttempts(duration) { + throw new Meteor.Error( + 403, + 'Too many attempts', + JSON.stringify({ + message: 'Wrong passwords were submitted too many times. Account is locked for a while.', + duration, + }), + ); + } + + static knownUsers() { + let knownUsers; + try { + knownUsers = Meteor.settings['accounts-lockout'].knownUsers; + } catch (e) { + knownUsers = false; + } + return knownUsers || false; + } + + static unlockTime(user) { + let unlockTime; + try { + unlockTime = user.services['accounts-lockout'].unlockTime; + } catch (e) { + unlockTime = 0; + } + return unlockTime || 0; + } + + static failedAttempts(user) { + let failedAttempts; + try { + failedAttempts = user.services['accounts-lockout'].failedAttempts; + } catch (e) { + failedAttempts = 0; + } + return failedAttempts || 0; + } + + static lastFailedAttempt(user) { + let lastFailedAttempt; + try { + lastFailedAttempt = user.services['accounts-lockout'].lastFailedAttempt; + } catch (e) { + lastFailedAttempt = 0; + } + return lastFailedAttempt || 0; + } + + static firstFailedAttempt(user) { + let firstFailedAttempt; + try { + firstFailedAttempt = user.services['accounts-lockout'].firstFailedAttempt; + } catch (e) { + firstFailedAttempt = 0; + } + return firstFailedAttempt || 0; + } + + static unlockAccount(userId) { + const query = { _id: userId }; + const data = { + $unset: { + 'services.accounts-lockout.unlockTime': 0, + 'services.accounts-lockout.failedAttempts': 0, + }, + }; + Meteor.users.update(query, data); + } +} + +export default KnownUser; diff --git a/packages/wekan-accounts-lockout/src/unknownUser.js b/packages/wekan-accounts-lockout/src/unknownUser.js new file mode 100644 index 000000000..443507c82 --- /dev/null +++ b/packages/wekan-accounts-lockout/src/unknownUser.js @@ -0,0 +1,329 @@ +import { Meteor } from 'meteor/meteor'; +import { Accounts } from 'meteor/accounts-base'; +import _AccountsLockoutCollection from './accountsLockoutCollection'; + +class UnknownUser { + constructor( + settings, + { + AccountsLockoutCollection = _AccountsLockoutCollection, + } = {}, + ) { + this.AccountsLockoutCollection = AccountsLockoutCollection; + this.settings = settings; + } + + startup() { + if (!(this.settings instanceof Function)) { + this.updateSettings(); + } + this.scheduleUnlocksForLockedAccounts(); + this.unlockAccountsIfLockoutAlreadyExpired(); + this.hookIntoAccounts(); + } + + updateSettings() { + const settings = UnknownUser.unknownUsers(); + if (settings) { + settings.forEach(function updateSetting({ key, value }) { + this.settings[key] = value; + }); + } + this.validateSettings(); + } + + validateSettings() { + if ( + !this.settings.failuresBeforeLockout || + this.settings.failuresBeforeLockout < 0 + ) { + throw new Error('"failuresBeforeLockout" is not positive integer'); + } + if ( + !this.settings.lockoutPeriod || + this.settings.lockoutPeriod < 0 + ) { + throw new Error('"lockoutPeriod" is not positive integer'); + } + if ( + !this.settings.failureWindow || + this.settings.failureWindow < 0 + ) { + throw new Error('"failureWindow" is not positive integer'); + } + } + + scheduleUnlocksForLockedAccounts() { + const lockedAccountsCursor = this.AccountsLockoutCollection.find( + { + 'services.accounts-lockout.unlockTime': { + $gt: Number(new Date()), + }, + }, + { + fields: { + 'services.accounts-lockout.unlockTime': 1, + }, + }, + ); + const currentTime = Number(new Date()); + lockedAccountsCursor.forEach((connection) => { + let lockDuration = this.unlockTime(connection) - currentTime; + if (lockDuration >= this.settings.lockoutPeriod) { + lockDuration = this.settings.lockoutPeriod * 1000; + } + if (lockDuration <= 1) { + lockDuration = 1; + } + Meteor.setTimeout( + this.unlockAccount.bind(this, connection.clientAddress), + lockDuration, + ); + }); + } + + unlockAccountsIfLockoutAlreadyExpired() { + const currentTime = Number(new Date()); + const query = { + 'services.accounts-lockout.unlockTime': { + $lt: currentTime, + }, + }; + const data = { + $unset: { + 'services.accounts-lockout.unlockTime': 0, + 'services.accounts-lockout.failedAttempts': 0, + }, + }; + this.AccountsLockoutCollection.update(query, data); + } + + hookIntoAccounts() { + Accounts.validateLoginAttempt(this.validateLoginAttempt.bind(this)); + Accounts.onLogin(this.onLogin.bind(this)); + } + + validateLoginAttempt(loginInfo) { + // don't interrupt non-password logins + if ( + loginInfo.type !== 'password' || + loginInfo.user !== undefined || + loginInfo.error === undefined || + loginInfo.error.reason !== 'User not found' + ) { + return loginInfo.allowed; + } + + if (this.settings instanceof Function) { + this.settings = this.settings(loginInfo.connection); + this.validateSettings(); + } + + const clientAddress = loginInfo.connection.clientAddress; + const unlockTime = this.unlockTime(loginInfo.connection); + let failedAttempts = 1 + this.failedAttempts(loginInfo.connection); + const firstFailedAttempt = this.firstFailedAttempt(loginInfo.connection); + const currentTime = Number(new Date()); + + const canReset = (currentTime - firstFailedAttempt) > (1000 * this.settings.failureWindow); + if (canReset) { + failedAttempts = 1; + this.resetAttempts(failedAttempts, clientAddress); + } + + const canIncrement = failedAttempts < this.settings.failuresBeforeLockout; + if (canIncrement) { + this.incrementAttempts(failedAttempts, clientAddress); + } + + const maxAttemptsAllowed = this.settings.failuresBeforeLockout; + const attemptsRemaining = maxAttemptsAllowed - failedAttempts; + if (unlockTime > currentTime) { + let duration = unlockTime - currentTime; + duration = Math.ceil(duration / 1000); + duration = duration > 1 ? duration : 1; + UnknownUser.tooManyAttempts(duration); + } + if (failedAttempts === maxAttemptsAllowed) { + this.setNewUnlockTime(failedAttempts, clientAddress); + + let duration = this.settings.lockoutPeriod; + duration = Math.ceil(duration); + duration = duration > 1 ? duration : 1; + return UnknownUser.tooManyAttempts(duration); + } + return UnknownUser.userNotFound( + failedAttempts, + maxAttemptsAllowed, + attemptsRemaining, + ); + } + + resetAttempts( + failedAttempts, + clientAddress, + ) { + const currentTime = Number(new Date()); + const query = { clientAddress }; + const data = { + $set: { + 'services.accounts-lockout.failedAttempts': failedAttempts, + 'services.accounts-lockout.lastFailedAttempt': currentTime, + 'services.accounts-lockout.firstFailedAttempt': currentTime, + }, + }; + this.AccountsLockoutCollection.upsert(query, data); + } + + incrementAttempts( + failedAttempts, + clientAddress, + ) { + const currentTime = Number(new Date()); + const query = { clientAddress }; + const data = { + $set: { + 'services.accounts-lockout.failedAttempts': failedAttempts, + 'services.accounts-lockout.lastFailedAttempt': currentTime, + }, + }; + this.AccountsLockoutCollection.upsert(query, data); + } + + setNewUnlockTime( + failedAttempts, + clientAddress, + ) { + const currentTime = Number(new Date()); + const newUnlockTime = (1000 * this.settings.lockoutPeriod) + currentTime; + const query = { clientAddress }; + const data = { + $set: { + 'services.accounts-lockout.failedAttempts': failedAttempts, + 'services.accounts-lockout.lastFailedAttempt': currentTime, + 'services.accounts-lockout.unlockTime': newUnlockTime, + }, + }; + this.AccountsLockoutCollection.upsert(query, data); + Meteor.setTimeout( + this.unlockAccount.bind(this, clientAddress), + this.settings.lockoutPeriod * 1000, + ); + } + + onLogin(loginInfo) { + if (loginInfo.type !== 'password') { + return; + } + const clientAddress = loginInfo.connection.clientAddress; + const query = { clientAddress }; + const data = { + $unset: { + 'services.accounts-lockout.unlockTime': 0, + 'services.accounts-lockout.failedAttempts': 0, + }, + }; + this.AccountsLockoutCollection.update(query, data); + } + + static userNotFound( + failedAttempts, + maxAttemptsAllowed, + attemptsRemaining, + ) { + throw new Meteor.Error( + 403, + 'User not found', + JSON.stringify({ + message: 'User not found', + failedAttempts, + maxAttemptsAllowed, + attemptsRemaining, + }), + ); + } + + static tooManyAttempts(duration) { + throw new Meteor.Error( + 403, + 'Too many attempts', + JSON.stringify({ + message: 'Wrong emails were submitted too many times. Account is locked for a while.', + duration, + }), + ); + } + + static unknownUsers() { + let unknownUsers; + try { + unknownUsers = Meteor.settings['accounts-lockout'].unknownUsers; + } catch (e) { + unknownUsers = false; + } + return unknownUsers || false; + } + + findOneByConnection(connection) { + return this.AccountsLockoutCollection.findOne({ + clientAddress: connection.clientAddress, + }); + } + + unlockTime(connection) { + connection = this.findOneByConnection(connection); + let unlockTime; + try { + unlockTime = connection.services['accounts-lockout'].unlockTime; + } catch (e) { + unlockTime = 0; + } + return unlockTime || 0; + } + + failedAttempts(connection) { + connection = this.findOneByConnection(connection); + let failedAttempts; + try { + failedAttempts = connection.services['accounts-lockout'].failedAttempts; + } catch (e) { + failedAttempts = 0; + } + return failedAttempts || 0; + } + + lastFailedAttempt(connection) { + connection = this.findOneByConnection(connection); + let lastFailedAttempt; + try { + lastFailedAttempt = connection.services['accounts-lockout'].lastFailedAttempt; + } catch (e) { + lastFailedAttempt = 0; + } + return lastFailedAttempt || 0; + } + + firstFailedAttempt(connection) { + connection = this.findOneByConnection(connection); + let firstFailedAttempt; + try { + firstFailedAttempt = connection.services['accounts-lockout'].firstFailedAttempt; + } catch (e) { + firstFailedAttempt = 0; + } + return firstFailedAttempt || 0; + } + + unlockAccount(clientAddress) { + const query = { clientAddress }; + const data = { + $unset: { + 'services.accounts-lockout.unlockTime': 0, + 'services.accounts-lockout.failedAttempts': 0, + }, + }; + this.AccountsLockoutCollection.update(query, data); + } +} + +export default UnknownUser; diff --git a/server/accounts-lockout.js b/server/accounts-lockout.js index 2eb0409bf..4b9854cfb 100644 --- a/server/accounts-lockout.js +++ b/server/accounts-lockout.js @@ -1,21 +1,26 @@ -// https://atmospherejs.com/lucasantoniassi/accounts-lockout -// server -import { AccountsLockout } from 'meteor/lucasantoniassi:accounts-lockout'; +Meteor.startup(() => { + // https://atmospherejs.com/lucasantoniassi/accounts-lockout + // server -new AccountsLockout({ - knownUsers: { - failuresBeforeLockout: - process.env.ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE || 3, - lockoutPeriod: process.env.ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD || 60, - failureWindow: - process.env.ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW || 15, - }, - unknownUsers: { - failuresBeforeLockout: - process.env.ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE || 3, - lockoutPeriod: - process.env.ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD || 60, - failureWindow: - process.env.ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW || 15, - }, -}).startup(); + if (Meteor.isServer) { + import { AccountsLockout } from 'meteor/wekan-accounts-lockout'; + + new AccountsLockout({ + knownUsers: { + failuresBeforeLockout: + process.env.ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE || 3, + lockoutPeriod: process.env.ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD || 60, + failureWindow: + process.env.ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW || 15, + }, + unknownUsers: { + failuresBeforeLockout: + process.env.ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE || 3, + lockoutPeriod: + process.env.ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD || 60, + failureWindow: + process.env.ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW || 15, + }, + }).startup(); + } +}); From e1cd87433a69b60de7a59acee3e9e6c139700261 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 12 Jun 2021 23:37:24 +0300 Subject: [PATCH 70/81] Updated ChangeLog. --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b4c9c03e..4cfc54050 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,12 @@ This release adds the following new features: [Part 2](https://github.com/wekan/wekan/commit/17acf1884850d8d95ae79493289adf18966df652). Thanks to xet7. +and removes some not needed files: + +- [Reduced Wekan bundle size from 636 MB to 467 MB by deleting all dependencies of lucasantoniassi:accounts-lockout and including + only required 10 files](https://github.com/wekan/wekan/commit/23e5e1e3bd081699ce39ce5887db7e612616014d). + Thanks to xet7. + and adds the following improvements: - [Add border and update label colors for better visibility](https://github.com/wekan/wekan/commit/2e1eb1e224c83f16a384316626d7a4183639d4cd). From 401e256d842a8c7798de62eb414a6024b046927c Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 12 Jun 2021 23:49:49 +0300 Subject: [PATCH 71/81] Updated translations. --- i18n/pt-BR.i18n.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/i18n/pt-BR.i18n.json b/i18n/pt-BR.i18n.json index 96813cb28..474306caf 100644 --- a/i18n/pt-BR.i18n.json +++ b/i18n/pt-BR.i18n.json @@ -358,11 +358,11 @@ "export-board-excel": "Exportar quadro para Excel", "user-can-not-export-excel": "Usuário não pode exportar Excel", "export-board-html": "Exportar quadro para HTML", - "export-card": "Export card", - "export-card-pdf": "Export card to PDF", - "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "export-card": "Exportar cartão", + "export-card-pdf": "Exportar cartão para PDF", + "user-can-not-export-card-to-pdf": "Usuário não pode exportar cartão para PDF", "exportBoardPopup-title": "Exportar quadro", - "exportCardPopup-title": "Export card", + "exportCardPopup-title": "Exportar cartão", "sort": "Ordenar", "sort-desc": "Clique para Ordenar Lista", "list-sort-by": "Ordenar a Lista por:", @@ -1052,6 +1052,6 @@ "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", - "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" + "maximize-card": "Maximizar Cartão", + "minimize-card": "Minimizar Cartão" } \ No newline at end of file From 19e73009b1aa5e7fd72699ca6d243b67e363c7c4 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sun, 13 Jun 2021 00:17:23 +0300 Subject: [PATCH 72/81] Updated ChangeLog. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cfc54050..6c074e723 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ and removes some not needed files: - [Reduced Wekan bundle size from 636 MB to 467 MB by deleting all dependencies of lucasantoniassi:accounts-lockout and including only required 10 files](https://github.com/wekan/wekan/commit/23e5e1e3bd081699ce39ce5887db7e612616014d). + Wekan Docker image size changed from 269.6 MB to 165.1 MB. Thanks to xet7. and adds the following improvements: From 33cdb906e237901910db1d47c411bebf91dd5b3d Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sun, 13 Jun 2021 08:49:08 +0300 Subject: [PATCH 73/81] Updated translations. --- i18n/fr.i18n.json | 28 ++++++++++++++-------------- i18n/he.i18n.json | 28 ++++++++++++++-------------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json index 33e0fe020..e244470bd 100644 --- a/i18n/fr.i18n.json +++ b/i18n/fr.i18n.json @@ -358,11 +358,11 @@ "export-board-excel": "Exporter le tableau vers Excel", "user-can-not-export-excel": "L'utilisateur ne peut pas exporter vers Excel", "export-board-html": "Exporter le tableau en HTML", - "export-card": "Export card", - "export-card-pdf": "Export card to PDF", - "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "export-card": "Exporter la carte", + "export-card-pdf": "Exporter la carte en PDF", + "user-can-not-export-card-to-pdf": "L'utilisateur ne peut pas exporter de carte en PDF", "exportBoardPopup-title": "Exporter le tableau", - "exportCardPopup-title": "Export card", + "exportCardPopup-title": "Exporter la carte", "sort": "Tri", "sort-desc": "Cliquez pour trier la liste", "list-sort-by": "Trier la liste par:", @@ -1044,14 +1044,14 @@ "copySwimlanePopup-title": "Copie de Couloir", "display-card-creator": "Afficher le créateur de la carte", "wait-spinner": "Icône d'attente", - "Bounce": "Bounce Wait Spinner", - "Cube": "Cube Wait Spinner", - "Cube-Grid": "Cube-Grid Wait Spinner", - "Dot": "Dot Wait Spinner", - "Double-Bounce": "Double Bounce Wait Spinner", - "Rotateplane": "Rotateplane Wait Spinner", - "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner", - "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" + "Bounce": "Icône d'attente rebond", + "Cube": "Icône d'attente cube", + "Cube-Grid": "Icône d'attente cube filaire", + "Dot": "Icône d'attente point", + "Double-Bounce": "Icône d'attente double rebond", + "Rotateplane": "Icône d'attente plan rotatif", + "Scaleout": "Icône d'attente mise à l'échelle", + "Wave": "Icône d'attente onde", + "maximize-card": "Maximiser la carte", + "minimize-card": "Minimiser la carte" } \ No newline at end of file diff --git a/i18n/he.i18n.json b/i18n/he.i18n.json index bbcc1536b..845220533 100644 --- a/i18n/he.i18n.json +++ b/i18n/he.i18n.json @@ -358,11 +358,11 @@ "export-board-excel": "ייצוא לוח ל־Excel", "user-can-not-export-excel": "המשתמש לא יכול לייצא ל־Excel", "export-board-html": "ייצוא לוח ל־HTML", - "export-card": "Export card", - "export-card-pdf": "Export card to PDF", - "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "export-card": "ייצוא כרטיס", + "export-card-pdf": "ייצוא כרטיס ל־PDF", + "user-can-not-export-card-to-pdf": "המשתמש לא יכול לייצא כרטיס ל־PDF", "exportBoardPopup-title": "ייצוא לוח", - "exportCardPopup-title": "Export card", + "exportCardPopup-title": "ייצוא כרטיס", "sort": "מיון", "sort-desc": "לחיצה למיון הרשימה", "list-sort-by": "מיון הרשימה לפי:", @@ -1044,14 +1044,14 @@ "copySwimlanePopup-title": "העתקת מסלול", "display-card-creator": "להציג את יוצר הכרטיסים", "wait-spinner": "שבשבת המתנה", - "Bounce": "Bounce Wait Spinner", - "Cube": "Cube Wait Spinner", - "Cube-Grid": "Cube-Grid Wait Spinner", - "Dot": "Dot Wait Spinner", - "Double-Bounce": "Double Bounce Wait Spinner", - "Rotateplane": "Rotateplane Wait Spinner", - "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner", - "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" + "Bounce": "שבשבת המתנה קופצת", + "Cube": "שבשבת המתנה קוביה", + "Cube-Grid": "שבשבת המתנה קוביית קשת", + "Dot": "שבשבת המתנה נקודה", + "Double-Bounce": "שבשבת המתנה קפיצה כפולה", + "Rotateplane": "שבשבת המתנה משטח נוטה", + "Scaleout": "שבשבת המתנה התרחקות", + "Wave": "שבשבת המתנה גל", + "maximize-card": "הגדלת כרטיס", + "minimize-card": "מזעור כרטיס" } \ No newline at end of file From f2fcfd6a47aab9ce2163df94e62137ddfd235533 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Sun, 13 Jun 2021 10:39:44 +0200 Subject: [PATCH 74/81] Manuel sort number 0 accepted Fixes: #3859 --- client/components/cards/cardDetails.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index 5c860c2d9..10d5a9511 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -370,7 +370,7 @@ BlazeComponent.extendComponent({ const sort = parseFloat(this.currentComponent() .getValue() .trim()); - if (sort) { + if (!Number.isNaN(sort)) { let card = this.data(); card.move(card.boardId, card.swimlaneId, card.listId, sort); } From 8aba58188df28e79ee1442ce8528ff5fee308170 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sun, 13 Jun 2021 15:51:49 +0300 Subject: [PATCH 75/81] Updated ChangeLog. --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c074e723..a1ec03d18 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,11 @@ and adds the following improvements: - [Add border and update label colors for better visibility](https://github.com/wekan/wekan/commit/2e1eb1e224c83f16a384316626d7a4183639d4cd). Thanks to xet7. +and fixes the following bugs: + +- [Manual sort number 0 accepted](https://github.com/wekan/wekan/pull/3861). + Thanks to mfilser. + Thanks to above GitHub users for their contributions and translators for their translations. # v5.34 2021-06-11 Wekan release From 362fd86dbf0d5a324f8f5d4bdba42537c2aacf7e Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sun, 13 Jun 2021 17:56:30 +0300 Subject: [PATCH 76/81] Updated translations. --- i18n/nl.i18n.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/i18n/nl.i18n.json b/i18n/nl.i18n.json index db298970f..f0d726bf5 100644 --- a/i18n/nl.i18n.json +++ b/i18n/nl.i18n.json @@ -358,11 +358,11 @@ "export-board-excel": "Exporteer bord naar Excel", "user-can-not-export-excel": "Gebruiker kan niet exporteren naar Excel", "export-board-html": "Exporteer bord naar HTML", - "export-card": "Export card", - "export-card-pdf": "Export card to PDF", - "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "export-card": "Exporteer kaart", + "export-card-pdf": "Exporteer kaart naar PDF", + "user-can-not-export-card-to-pdf": "Gebruiker kan kaart niet naar PDF exporteren", "exportBoardPopup-title": "Exporteer bord", - "exportCardPopup-title": "Export card", + "exportCardPopup-title": "Exporteer kaart", "sort": "Sorteer", "sort-desc": "Klik om lijst te sorteren", "list-sort-by": "Sorteer lijst op", @@ -1052,6 +1052,6 @@ "Rotateplane": "Roterend Vlak Wacht Spinner", "Scaleout": "Vergrotende Wacht Spinner", "Wave": "Golvende Wacht Spinner", - "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" + "maximize-card": "Maximaliseer Kaart", + "minimize-card": "Minimaliseer Kaart" } \ No newline at end of file From 220c52373a626c18f90832786c98b14d78f09fc9 Mon Sep 17 00:00:00 2001 From: Emile NDAGIJIMANA Date: Mon, 14 Jun 2021 10:03:48 +0200 Subject: [PATCH 77/81] Added some controls and warning messages when user try to delete an organization or team that has at least one user belongs to it --- client/components/settings/peopleBody.jade | 6 +++ client/components/settings/peopleBody.js | 48 +++++++++++++++++----- 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/client/components/settings/peopleBody.jade b/client/components/settings/peopleBody.jade index 6291b9779..c4e537ebe 100644 --- a/client/components/settings/peopleBody.jade +++ b/client/components/settings/peopleBody.jade @@ -531,6 +531,9 @@ template(name="settingsOrgPopup") ul.pop-over-list li form + label#deleteOrgWarningMsg.hide + | {{_ 'delete-org-warning-message'}} + br label | {{_ 'delete-org-confirm-popup'}} br @@ -552,6 +555,9 @@ template(name="settingsTeamPopup") ul.pop-over-list li form + label#deleteTeamWarningMsg.hide + | {{_ 'delete-team-warning-message'}} + br label | {{_ 'delete-team-confirm-popup'}} br diff --git a/client/components/settings/peopleBody.js b/client/components/settings/peopleBody.js index aecbf50e0..bc1703a6a 100644 --- a/client/components/settings/peopleBody.js +++ b/client/components/settings/peopleBody.js @@ -551,12 +551,15 @@ Template.editUserPopup.events({ let userTeamsList = userTeams.split(","); let userTeamsIdsList = userTeamsIds.split(","); let userTms = []; - for(let i = 0; i < userTeamsList.length; i++){ - userTms.push({ - "teamId": userTeamsIdsList[i], - "teamDisplayName": userTeamsList[i], - }) + if(userTeams != ''){ + for(let i = 0; i < userTeamsList.length; i++){ + userTms.push({ + "teamId": userTeamsIdsList[i], + "teamDisplayName": userTeamsList[i], + }) + } } + Users.update(this.userId, { $set:{ teams: userTms @@ -566,12 +569,15 @@ Template.editUserPopup.events({ let userOrgsList = userOrgs.split(","); let userOrgsIdsList = userOrgsIds.split(","); let userOrganizations = []; - for(let i = 0; i < userOrgsList.length; i++){ - userOrganizations.push({ - "orgId": userOrgsIdsList[i], - "orgDisplayName": userOrgsList[i], - }) + if(userOrgs != ''){ + for(let i = 0; i < userOrgsList.length; i++){ + userOrganizations.push({ + "orgId": userOrgsIdsList[i], + "orgDisplayName": userOrgsList[i], + }) + } } + Users.update(this.userId, { $set:{ orgs: userOrganizations @@ -724,7 +730,7 @@ UpdateUserOrgsOrTeamsElement = function(isNewUser = false){ lstInputValuesIds = []; } index = lstInputValues.indexOf(selectedEltValue); - indexId = lstInputValuesIds.indexOf(selectedEltValue); + indexId = lstInputValuesIds.indexOf(selectedEltValueId); if(userOrgsTeamsAction == "addOrg" || userOrgsTeamsAction == "addTeam"){ if(index <= -1 && selectedEltValueId != "-1"){ lstInputValues.push(selectedEltValue); @@ -923,6 +929,16 @@ Template.newUserPopup.events({ Template.settingsOrgPopup.events({ 'click #deleteButton'(event) { event.preventDefault(); + if(Users.find({"orgs.orgId": this.orgId}).count() > 0) + { + let orgClassList = document.getElementById("deleteOrgWarningMsg").classList; + if(orgClassList.contains('hide')) + { + orgClassList.remove('hide'); + document.getElementById("deleteOrgWarningMsg").style.color = "red"; + } + return; + } Org.remove(this.orgId); Popup.close(); } @@ -931,6 +947,16 @@ Template.settingsOrgPopup.events({ Template.settingsTeamPopup.events({ 'click #deleteButton'(event) { event.preventDefault(); + if(Users.find({"teams.teamId": this.teamId}).count() > 0) + { + let teamClassList = document.getElementById("deleteTeamWarningMsg").classList; + if(teamClassList.contains('hide')) + { + teamClassList.remove('hide'); + document.getElementById("deleteTeamWarningMsg").style.color = "red"; + } + return; + } Team.remove(this.teamId); Popup.close(); } From ab06597b7c6e7249440c1800ba905131fe7bee65 Mon Sep 17 00:00:00 2001 From: Emile NDAGIJIMANA Date: Mon, 14 Jun 2021 11:29:51 +0200 Subject: [PATCH 78/81] Added some controls and warning messages when user try to delete an organization or team that has at least one user belongs to it --- i18n/ar-EG.i18n.json | 6 ++++-- i18n/ar.i18n.json | 6 ++++-- i18n/bg.i18n.json | 6 ++++-- i18n/br.i18n.json | 6 ++++-- i18n/ca.i18n.json | 6 ++++-- i18n/cs.i18n.json | 6 ++++-- i18n/da.i18n.json | 6 ++++-- i18n/de-CH.i18n.json | 6 ++++-- i18n/de.i18n.json | 6 ++++-- i18n/el.i18n.json | 6 ++++-- i18n/en-GB.i18n.json | 6 ++++-- i18n/en.i18n.json | 4 +++- i18n/eo.i18n.json | 6 ++++-- i18n/es-AR.i18n.json | 6 ++++-- i18n/es-CL.i18n.json | 6 ++++-- i18n/es-LA.i18n.json | 6 ++++-- i18n/es-MX.i18n.json | 6 ++++-- i18n/es-PE.i18n.json | 6 ++++-- i18n/es-PY.i18n.json | 6 ++++-- i18n/es.i18n.json | 6 ++++-- i18n/eu.i18n.json | 6 ++++-- i18n/fa-IR.i18n.json | 6 ++++-- i18n/fa.i18n.json | 6 ++++-- i18n/fi.i18n.json | 6 ++++-- i18n/fr.i18n.json | 6 ++++-- i18n/gl.i18n.json | 6 ++++-- i18n/he.i18n.json | 6 ++++-- i18n/hi.i18n.json | 6 ++++-- i18n/hr.i18n.json | 6 ++++-- i18n/hu.i18n.json | 6 ++++-- i18n/hy.i18n.json | 6 ++++-- i18n/id.i18n.json | 6 ++++-- i18n/ig.i18n.json | 6 ++++-- i18n/it.i18n.json | 6 ++++-- i18n/ja.i18n.json | 6 ++++-- i18n/ka.i18n.json | 6 ++++-- i18n/km.i18n.json | 6 ++++-- i18n/ko.i18n.json | 6 ++++-- i18n/lt.i18n.json | 6 ++++-- i18n/lv.i18n.json | 6 ++++-- i18n/mk.i18n.json | 6 ++++-- i18n/mn.i18n.json | 6 ++++-- i18n/nb.i18n.json | 6 ++++-- i18n/nl.i18n.json | 6 ++++-- i18n/oc.i18n.json | 6 ++++-- i18n/pa.i18n.json | 6 ++++-- i18n/pl.i18n.json | 6 ++++-- i18n/pt-BR.i18n.json | 6 ++++-- i18n/pt.i18n.json | 6 ++++-- i18n/ro.i18n.json | 6 ++++-- i18n/ru.i18n.json | 6 ++++-- i18n/sk.i18n.json | 6 ++++-- i18n/sl.i18n.json | 6 ++++-- i18n/sr.i18n.json | 6 ++++-- i18n/sv.i18n.json | 6 ++++-- i18n/sw.i18n.json | 6 ++++-- i18n/ta.i18n.json | 6 ++++-- i18n/th.i18n.json | 6 ++++-- i18n/tr.i18n.json | 6 ++++-- i18n/uk.i18n.json | 6 ++++-- i18n/vi.i18n.json | 6 ++++-- i18n/zh-CN.i18n.json | 6 ++++-- i18n/zh-HK.i18n.json | 6 ++++-- i18n/zh-TW.i18n.json | 6 ++++-- 64 files changed, 255 insertions(+), 127 deletions(-) diff --git a/i18n/ar-EG.i18n.json b/i18n/ar-EG.i18n.json index 657defbaf..9ef52fe39 100644 --- a/i18n/ar-EG.i18n.json +++ b/i18n/ar-EG.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/ar.i18n.json b/i18n/ar.i18n.json index 709fad351..460d0a3af 100644 --- a/i18n/ar.i18n.json +++ b/i18n/ar.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/bg.i18n.json b/i18n/bg.i18n.json index cf449eb44..291d4cf92 100644 --- a/i18n/bg.i18n.json +++ b/i18n/bg.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/br.i18n.json b/i18n/br.i18n.json index f988ac022..c8c7c3582 100644 --- a/i18n/br.i18n.json +++ b/i18n/br.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/ca.i18n.json b/i18n/ca.i18n.json index f6186f0f8..373aeb0ad 100644 --- a/i18n/ca.i18n.json +++ b/i18n/ca.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/cs.i18n.json b/i18n/cs.i18n.json index 252f0759f..b82ad11b1 100644 --- a/i18n/cs.i18n.json +++ b/i18n/cs.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximalizovat kartu", - "minimize-card": "Minimalizovat kartu" -} \ No newline at end of file + "minimize-card": "Minimalizovat kartu", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/da.i18n.json b/i18n/da.i18n.json index b8f79ee78..9fa5fdb6d 100644 --- a/i18n/da.i18n.json +++ b/i18n/da.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/de-CH.i18n.json b/i18n/de-CH.i18n.json index d1b3dbbd1..2804e1dfb 100644 --- a/i18n/de-CH.i18n.json +++ b/i18n/de-CH.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json index 21ce7e0cd..5ec558cb6 100644 --- a/i18n/de.i18n.json +++ b/i18n/de.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout-Warte-Symbol", "Wave": "Wellen-Warte-Symbol", "maximize-card": "Karte maximieren", - "minimize-card": "Karte minimieren" -} \ No newline at end of file + "minimize-card": "Karte minimieren", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/el.i18n.json b/i18n/el.i18n.json index abfa68508..44e8f8efb 100644 --- a/i18n/el.i18n.json +++ b/i18n/el.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/en-GB.i18n.json b/i18n/en-GB.i18n.json index af2a7d2e3..cdb42f63e 100644 --- a/i18n/en-GB.i18n.json +++ b/i18n/en-GB.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index d659ed34f..facd0a31a 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -1054,5 +1054,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" } diff --git a/i18n/eo.i18n.json b/i18n/eo.i18n.json index 44f06172f..153a6deb6 100644 --- a/i18n/eo.i18n.json +++ b/i18n/eo.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/es-AR.i18n.json b/i18n/es-AR.i18n.json index 4a101c341..1c40d8e84 100644 --- a/i18n/es-AR.i18n.json +++ b/i18n/es-AR.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/es-CL.i18n.json b/i18n/es-CL.i18n.json index 3513423fd..3ac377c65 100644 --- a/i18n/es-CL.i18n.json +++ b/i18n/es-CL.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/es-LA.i18n.json b/i18n/es-LA.i18n.json index 657defbaf..9ef52fe39 100644 --- a/i18n/es-LA.i18n.json +++ b/i18n/es-LA.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/es-MX.i18n.json b/i18n/es-MX.i18n.json index 3222a6c0a..e2c91dc9a 100644 --- a/i18n/es-MX.i18n.json +++ b/i18n/es-MX.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/es-PE.i18n.json b/i18n/es-PE.i18n.json index 09f4482c5..4c2c07176 100644 --- a/i18n/es-PE.i18n.json +++ b/i18n/es-PE.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/es-PY.i18n.json b/i18n/es-PY.i18n.json index 657defbaf..9ef52fe39 100644 --- a/i18n/es-PY.i18n.json +++ b/i18n/es-PY.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/es.i18n.json b/i18n/es.i18n.json index 416d7980f..fd27f2427 100644 --- a/i18n/es.i18n.json +++ b/i18n/es.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/eu.i18n.json b/i18n/eu.i18n.json index 65427fb81..0c473d418 100644 --- a/i18n/eu.i18n.json +++ b/i18n/eu.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/fa-IR.i18n.json b/i18n/fa-IR.i18n.json index 6788a20a1..221c25527 100644 --- a/i18n/fa-IR.i18n.json +++ b/i18n/fa-IR.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/fa.i18n.json b/i18n/fa.i18n.json index 7b5aa3033..9c4dee1f8 100644 --- a/i18n/fa.i18n.json +++ b/i18n/fa.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/fi.i18n.json b/i18n/fi.i18n.json index 1b2953678..06e0cd76e 100644 --- a/i18n/fi.i18n.json +++ b/i18n/fi.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Skaalaus ulos odotus pyörijä", "Wave": "Aalto odotus pyörijä", "maximize-card": "Suurenna kortti", - "minimize-card": "Pienennä kortti" -} \ No newline at end of file + "minimize-card": "Pienennä kortti", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json index e244470bd..12d3bbea0 100644 --- a/i18n/fr.i18n.json +++ b/i18n/fr.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Icône d'attente mise à l'échelle", "Wave": "Icône d'attente onde", "maximize-card": "Maximiser la carte", - "minimize-card": "Minimiser la carte" -} \ No newline at end of file + "minimize-card": "Minimiser la carte", + "delete-org-warning-message": "Impossible de supprimer cette organisation, il y a au moins un utilisateur qui appartient à cette organisation", + "delete-team-warning-message": "Impossible de supprimer cette équipe, il y a au moins un utilisateur qui appartient à cette équipe" +} diff --git a/i18n/gl.i18n.json b/i18n/gl.i18n.json index 3e9b54d5f..4db0b6ca1 100644 --- a/i18n/gl.i18n.json +++ b/i18n/gl.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/he.i18n.json b/i18n/he.i18n.json index 845220533..bd1032f00 100644 --- a/i18n/he.i18n.json +++ b/i18n/he.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "שבשבת המתנה התרחקות", "Wave": "שבשבת המתנה גל", "maximize-card": "הגדלת כרטיס", - "minimize-card": "מזעור כרטיס" -} \ No newline at end of file + "minimize-card": "מזעור כרטיס", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/hi.i18n.json b/i18n/hi.i18n.json index 263553622..05a0f945e 100644 --- a/i18n/hi.i18n.json +++ b/i18n/hi.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/hr.i18n.json b/i18n/hr.i18n.json index 1d3b1e376..5add4161e 100644 --- a/i18n/hr.i18n.json +++ b/i18n/hr.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/hu.i18n.json b/i18n/hu.i18n.json index 20b03e9eb..60179289f 100644 --- a/i18n/hu.i18n.json +++ b/i18n/hu.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/hy.i18n.json b/i18n/hy.i18n.json index a582f9531..53432aeda 100644 --- a/i18n/hy.i18n.json +++ b/i18n/hy.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/id.i18n.json b/i18n/id.i18n.json index 6bebf0bc3..f222a97e5 100644 --- a/i18n/id.i18n.json +++ b/i18n/id.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/ig.i18n.json b/i18n/ig.i18n.json index 692bbd7a1..6f9dc48d6 100644 --- a/i18n/ig.i18n.json +++ b/i18n/ig.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json index b41a159fe..c812b08cb 100644 --- a/i18n/it.i18n.json +++ b/i18n/it.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/ja.i18n.json b/i18n/ja.i18n.json index 291f8f1ba..2a90efee6 100644 --- a/i18n/ja.i18n.json +++ b/i18n/ja.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/ka.i18n.json b/i18n/ka.i18n.json index 92c470a50..658bcd764 100644 --- a/i18n/ka.i18n.json +++ b/i18n/ka.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/km.i18n.json b/i18n/km.i18n.json index 7fb57c43c..1f46ae99d 100644 --- a/i18n/km.i18n.json +++ b/i18n/km.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/ko.i18n.json b/i18n/ko.i18n.json index b000f6ee0..4769fa2d6 100644 --- a/i18n/ko.i18n.json +++ b/i18n/ko.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/lt.i18n.json b/i18n/lt.i18n.json index 657defbaf..9ef52fe39 100644 --- a/i18n/lt.i18n.json +++ b/i18n/lt.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/lv.i18n.json b/i18n/lv.i18n.json index 0509fef5b..07cb5a148 100644 --- a/i18n/lv.i18n.json +++ b/i18n/lv.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/mk.i18n.json b/i18n/mk.i18n.json index e26d5e93d..843bd806c 100644 --- a/i18n/mk.i18n.json +++ b/i18n/mk.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/mn.i18n.json b/i18n/mn.i18n.json index b5135656d..00041ebec 100644 --- a/i18n/mn.i18n.json +++ b/i18n/mn.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/nb.i18n.json b/i18n/nb.i18n.json index 418fe6182..c8e5c5b28 100644 --- a/i18n/nb.i18n.json +++ b/i18n/nb.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Ventehjul - Utskaliering", "Wave": "Ventehjul - Bølge", "maximize-card": "Maksimer Kort", - "minimize-card": "Minimer Kort" -} \ No newline at end of file + "minimize-card": "Minimer Kort", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/nl.i18n.json b/i18n/nl.i18n.json index f0d726bf5..69f6f8e3e 100644 --- a/i18n/nl.i18n.json +++ b/i18n/nl.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Vergrotende Wacht Spinner", "Wave": "Golvende Wacht Spinner", "maximize-card": "Maximaliseer Kaart", - "minimize-card": "Minimaliseer Kaart" -} \ No newline at end of file + "minimize-card": "Minimaliseer Kaart", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/oc.i18n.json b/i18n/oc.i18n.json index 99f80ad72..9a6ff9260 100644 --- a/i18n/oc.i18n.json +++ b/i18n/oc.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/pa.i18n.json b/i18n/pa.i18n.json index 657defbaf..9ef52fe39 100644 --- a/i18n/pa.i18n.json +++ b/i18n/pa.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/pl.i18n.json b/i18n/pl.i18n.json index 85e37d3fb..b192553fb 100644 --- a/i18n/pl.i18n.json +++ b/i18n/pl.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/pt-BR.i18n.json b/i18n/pt-BR.i18n.json index 474306caf..2b3681b37 100644 --- a/i18n/pt-BR.i18n.json +++ b/i18n/pt-BR.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximizar Cartão", - "minimize-card": "Minimizar Cartão" -} \ No newline at end of file + "minimize-card": "Minimizar Cartão", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/pt.i18n.json b/i18n/pt.i18n.json index 84b301242..f0f50a866 100644 --- a/i18n/pt.i18n.json +++ b/i18n/pt.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/ro.i18n.json b/i18n/ro.i18n.json index 3c0a44dc5..7bb11cbfe 100644 --- a/i18n/ro.i18n.json +++ b/i18n/ro.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/ru.i18n.json b/i18n/ru.i18n.json index 65deedac1..69d4c1468 100644 --- a/i18n/ru.i18n.json +++ b/i18n/ru.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/sk.i18n.json b/i18n/sk.i18n.json index e2d83bf28..2abbad846 100644 --- a/i18n/sk.i18n.json +++ b/i18n/sk.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/sl.i18n.json b/i18n/sl.i18n.json index 7e6064918..e9ff70837 100644 --- a/i18n/sl.i18n.json +++ b/i18n/sl.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/sr.i18n.json b/i18n/sr.i18n.json index 4f0d9b6d5..1c494890e 100644 --- a/i18n/sr.i18n.json +++ b/i18n/sr.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/sv.i18n.json b/i18n/sv.i18n.json index 7b99b9352..9454e116e 100644 --- a/i18n/sv.i18n.json +++ b/i18n/sv.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/sw.i18n.json b/i18n/sw.i18n.json index 6100ba4ee..00af3bcf6 100644 --- a/i18n/sw.i18n.json +++ b/i18n/sw.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/ta.i18n.json b/i18n/ta.i18n.json index cf54d830f..2fa2e9800 100644 --- a/i18n/ta.i18n.json +++ b/i18n/ta.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/th.i18n.json b/i18n/th.i18n.json index 295490dc5..62f8e9e8d 100644 --- a/i18n/th.i18n.json +++ b/i18n/th.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/tr.i18n.json b/i18n/tr.i18n.json index b44dc8002..af8c896ba 100644 --- a/i18n/tr.i18n.json +++ b/i18n/tr.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/uk.i18n.json b/i18n/uk.i18n.json index 2d9fdcc9d..18e51812a 100644 --- a/i18n/uk.i18n.json +++ b/i18n/uk.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/vi.i18n.json b/i18n/vi.i18n.json index 43da1e121..9ab06a66e 100644 --- a/i18n/vi.i18n.json +++ b/i18n/vi.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/zh-CN.i18n.json b/i18n/zh-CN.i18n.json index 512c8525a..f12029557 100644 --- a/i18n/zh-CN.i18n.json +++ b/i18n/zh-CN.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/zh-HK.i18n.json b/i18n/zh-HK.i18n.json index 8c75d1ec8..9b6e0982f 100644 --- a/i18n/zh-HK.i18n.json +++ b/i18n/zh-HK.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} diff --git a/i18n/zh-TW.i18n.json b/i18n/zh-TW.i18n.json index a99319d35..4125f851d 100644 --- a/i18n/zh-TW.i18n.json +++ b/i18n/zh-TW.i18n.json @@ -1053,5 +1053,7 @@ "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card" -} \ No newline at end of file + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user belongs to is", + "delete-team-warning-message": "Can not delete this team, there is at least one user belongs to is" +} From ecd780962f1a9738d40e58b425c09ecde34e385b Mon Sep 17 00:00:00 2001 From: Emile NDAGIJIMANA Date: Mon, 14 Jun 2021 11:32:06 +0200 Subject: [PATCH 79/81] Added some controls and warning messages when user try to delete an organization or team that has at least one user belongs to it --- models/org.js | 1 + 1 file changed, 1 insertion(+) diff --git a/models/org.js b/models/org.js index a4ffffd80..8efa9b64b 100644 --- a/models/org.js +++ b/models/org.js @@ -113,6 +113,7 @@ if (Meteor.isServer) { fetch: [], }); + Meteor.methods({ setCreateOrg( orgDisplayName, From bc98d82acfac2fe07247d0c7f74bc76ed0d78eb9 Mon Sep 17 00:00:00 2001 From: Emile NDAGIJIMANA Date: Mon, 14 Jun 2021 12:46:00 +0200 Subject: [PATCH 80/81] Added some controls and warning messages when user try to delete an organization or team that has at least one user belongs to it From 250f95deb62aa392dba07963099f81ade8b8f31d Mon Sep 17 00:00:00 2001 From: Emile NDAGIJIMANA Date: Mon, 14 Jun 2021 12:51:15 +0200 Subject: [PATCH 81/81] Added some controls and warning messages when user try to delete an organization or team that has at least one user belongs to it --- client/components/settings/peopleBody.jade | 4 ++-- client/components/settings/peopleBody.js | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/client/components/settings/peopleBody.jade b/client/components/settings/peopleBody.jade index c4e537ebe..e985fb11f 100644 --- a/client/components/settings/peopleBody.jade +++ b/client/components/settings/peopleBody.jade @@ -531,7 +531,7 @@ template(name="settingsOrgPopup") ul.pop-over-list li form - label#deleteOrgWarningMsg.hide + label#deleteOrgWarningMessage.hide | {{_ 'delete-org-warning-message'}} br label @@ -555,7 +555,7 @@ template(name="settingsTeamPopup") ul.pop-over-list li form - label#deleteTeamWarningMsg.hide + label#deleteTeamWarningMessage.hide | {{_ 'delete-team-warning-message'}} br label diff --git a/client/components/settings/peopleBody.js b/client/components/settings/peopleBody.js index bc1703a6a..ab6d1fbd2 100644 --- a/client/components/settings/peopleBody.js +++ b/client/components/settings/peopleBody.js @@ -931,11 +931,11 @@ Template.settingsOrgPopup.events({ event.preventDefault(); if(Users.find({"orgs.orgId": this.orgId}).count() > 0) { - let orgClassList = document.getElementById("deleteOrgWarningMsg").classList; + let orgClassList = document.getElementById("deleteOrgWarningMessage").classList; if(orgClassList.contains('hide')) { orgClassList.remove('hide'); - document.getElementById("deleteOrgWarningMsg").style.color = "red"; + document.getElementById("deleteOrgWarningMessage").style.color = "red"; } return; } @@ -949,11 +949,11 @@ Template.settingsTeamPopup.events({ event.preventDefault(); if(Users.find({"teams.teamId": this.teamId}).count() > 0) { - let teamClassList = document.getElementById("deleteTeamWarningMsg").classList; + let teamClassList = document.getElementById("deleteTeamWarningMessage").classList; if(teamClassList.contains('hide')) { teamClassList.remove('hide'); - document.getElementById("deleteTeamWarningMsg").style.color = "red"; + document.getElementById("deleteTeamWarningMessage").style.color = "red"; } return; }
    Does the board allows requested by?
    allowsCardSortingByNumberbooleantruenoneDoes the board allows card sorting by number?
    allowsAssignedBy boolean true