summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md8
-rw-r--r--client/lib/filter.js169
-rw-r--r--i18n/de.i18n.json8
-rw-r--r--i18n/pt-BR.i18n.json126
-rw-r--r--models/cards.js1
-rw-r--r--package.json2
-rw-r--r--sandstorm-pkgdef.capnp4
7 files changed, 151 insertions, 167 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c581c60a..6698a16a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,11 @@
+# v1.01 2018-05-23 Wekan release
+
+This release possibly fixes the following bugs, please test:
+
+* [Possible quickfix for all customFields Import errors, please test](https://github.com/wekan/wekan/pull/1653).
+
+Thanks to GitHub users feuerball11 and xet7 for their contributions.
+
# v1.00 2018-05-21 Wekan release
This release fixes the following bugs:
diff --git a/client/lib/filter.js b/client/lib/filter.js
index c5f8fe7e..fa139cfe 100644
--- a/client/lib/filter.js
+++ b/client/lib/filter.js
@@ -86,18 +86,17 @@ class AdvancedFilter {
constructor() {
this._dep = new Tracker.Dependency();
this._filter = '';
- this._lastValide={};
+ this._lastValide = {};
}
- set(str)
- {
+ set(str) {
this._filter = str;
this._dep.changed();
}
reset() {
this._filter = '';
- this._lastValide={};
+ this._lastValide = {};
this._dep.changed();
}
@@ -106,75 +105,63 @@ class AdvancedFilter {
return this._filter !== '';
}
- _filterToCommands(){
+ _filterToCommands() {
const commands = [];
let current = '';
let string = false;
let wasString = false;
let ignore = false;
- for (let i = 0; i < this._filter.length; i++)
- {
+ for (let i = 0; i < this._filter.length; i++) {
const char = this._filter.charAt(i);
- if (ignore)
- {
+ if (ignore) {
ignore = false;
continue;
}
- if (char === '\'')
- {
+ if (char === '\'') {
string = !string;
if (string) wasString = true;
continue;
}
- if (char === '\\')
- {
+ if (char === '\\') {
ignore = true;
continue;
}
- if (char === ' ' && !string)
- {
- commands.push({'cmd':current, 'string':wasString});
+ if (char === ' ' && !string) {
+ commands.push({ 'cmd': current, 'string': wasString });
wasString = false;
current = '';
continue;
}
current += char;
}
- if (current !== '')
- {
- commands.push({'cmd':current, 'string':wasString});
+ if (current !== '') {
+ commands.push({ 'cmd': current, 'string': wasString });
}
return commands;
}
- _fieldNameToId(field)
- {
- const found = CustomFields.findOne({'name':field});
+ _fieldNameToId(field) {
+ const found = CustomFields.findOne({ 'name': field });
return found._id;
}
- _arrayToSelector(commands)
- {
+ _arrayToSelector(commands) {
try {
//let changed = false;
this._processSubCommands(commands);
}
- catch (e){return this._lastValide;}
- this._lastValide = {$or: commands};
- return {$or: commands};
+ catch (e) { return this._lastValide; }
+ this._lastValide = { $or: commands };
+ return { $or: commands };
}
- _processSubCommands(commands)
- {
+ _processSubCommands(commands) {
const subcommands = [];
let level = 0;
let start = -1;
- for (let i = 0; i < commands.length; i++)
- {
- if (commands[i].cmd)
- {
- switch (commands[i].cmd)
- {
+ for (let i = 0; i < commands.length; i++) {
+ if (commands[i].cmd) {
+ switch (commands[i].cmd) {
case '(':
{
level++;
@@ -190,8 +177,7 @@ class AdvancedFilter {
}
default:
{
- if (level > 0)
- {
+ if (level > 0) {
subcommands.push(commands[i]);
commands.splice(i, 1);
i--;
@@ -201,8 +187,7 @@ class AdvancedFilter {
}
}
}
- if (start !== -1)
- {
+ if (start !== -1) {
this._processSubCommands(subcommands);
if (subcommands.length === 1)
commands.splice(start, 0, subcommands[0]);
@@ -213,22 +198,18 @@ class AdvancedFilter {
this._processLogicalOperators(commands);
}
- _processConditions(commands)
- {
- for (let i = 0; i < commands.length; i++)
- {
- if (!commands[i].string && commands[i].cmd)
- {
- switch (commands[i].cmd)
- {
+ _processConditions(commands) {
+ for (let i = 0; i < commands.length; i++) {
+ if (!commands[i].string && commands[i].cmd) {
+ switch (commands[i].cmd) {
case '=':
case '==':
case '===':
{
- const field = commands[i-1].cmd;
- const str = commands[i+1].cmd;
- commands[i] = {'customFields._id':this._fieldNameToId(field), 'customFields.value':str};
- commands.splice(i-1, 1);
+ const field = commands[i - 1].cmd;
+ const str = commands[i + 1].cmd;
+ commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': str };
+ commands.splice(i - 1, 1);
commands.splice(i, 1);
//changed = true;
i--;
@@ -237,10 +218,10 @@ class AdvancedFilter {
case '!=':
case '!==':
{
- const field = commands[i-1].cmd;
- const str = commands[i+1].cmd;
- commands[i] = {'customFields._id':this._fieldNameToId(field), 'customFields.value': { $not: str }};
- commands.splice(i-1, 1);
+ const field = commands[i - 1].cmd;
+ const str = commands[i + 1].cmd;
+ commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': { $not: str } };
+ commands.splice(i - 1, 1);
commands.splice(i, 1);
//changed = true;
i--;
@@ -251,10 +232,10 @@ class AdvancedFilter {
case 'Gt':
case 'GT':
{
- const field = commands[i-1].cmd;
- const str = commands[i+1].cmd;
- commands[i] = {'customFields._id':this._fieldNameToId(field), 'customFields.value': { $gt: str } };
- commands.splice(i-1, 1);
+ const field = commands[i - 1].cmd;
+ const str = commands[i + 1].cmd;
+ commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': { $gt: str } };
+ commands.splice(i - 1, 1);
commands.splice(i, 1);
//changed = true;
i--;
@@ -266,10 +247,10 @@ class AdvancedFilter {
case 'Gte':
case 'GTE':
{
- const field = commands[i-1].cmd;
- const str = commands[i+1].cmd;
- commands[i] = {'customFields._id':this._fieldNameToId(field), 'customFields.value': { $gte: str } };
- commands.splice(i-1, 1);
+ const field = commands[i - 1].cmd;
+ const str = commands[i + 1].cmd;
+ commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': { $gte: str } };
+ commands.splice(i - 1, 1);
commands.splice(i, 1);
//changed = true;
i--;
@@ -280,10 +261,10 @@ class AdvancedFilter {
case 'Lt':
case 'LT':
{
- const field = commands[i-1].cmd;
- const str = commands[i+1].cmd;
- commands[i] = {'customFields._id':this._fieldNameToId(field), 'customFields.value': { $lt: str } };
- commands.splice(i-1, 1);
+ const field = commands[i - 1].cmd;
+ const str = commands[i + 1].cmd;
+ commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': { $lt: str } };
+ commands.splice(i - 1, 1);
commands.splice(i, 1);
//changed = true;
i--;
@@ -295,10 +276,10 @@ class AdvancedFilter {
case 'Lte':
case 'LTE':
{
- const field = commands[i-1].cmd;
- const str = commands[i+1].cmd;
- commands[i] = {'customFields._id':this._fieldNameToId(field), 'customFields.value': { $lte: str } };
- commands.splice(i-1, 1);
+ const field = commands[i - 1].cmd;
+ const str = commands[i + 1].cmd;
+ commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': { $lte: str } };
+ commands.splice(i - 1, 1);
commands.splice(i, 1);
//changed = true;
i--;
@@ -310,24 +291,20 @@ class AdvancedFilter {
}
}
- _processLogicalOperators(commands)
- {
- for (let i = 0; i < commands.length; i++)
- {
- if (!commands[i].string && commands[i].cmd)
- {
- switch (commands[i].cmd)
- {
+ _processLogicalOperators(commands) {
+ for (let i = 0; i < commands.length; i++) {
+ if (!commands[i].string && commands[i].cmd) {
+ switch (commands[i].cmd) {
case 'or':
case 'Or':
case 'OR':
case '|':
case '||':
{
- const op1 = commands[i-1];
- const op2 = commands[i+1];
- commands[i] = {$or: [op1, op2]};
- commands.splice(i-1, 1);
+ const op1 = commands[i - 1];
+ const op2 = commands[i + 1];
+ commands[i] = { $or: [op1, op2] };
+ commands.splice(i - 1, 1);
commands.splice(i, 1);
//changed = true;
i--;
@@ -339,10 +316,10 @@ class AdvancedFilter {
case '&':
case '&&':
{
- const op1 = commands[i-1];
- const op2 = commands[i+1];
- commands[i] = {$and: [op1, op2]};
- commands.splice(i-1, 1);
+ const op1 = commands[i - 1];
+ const op2 = commands[i + 1];
+ commands[i] = { $and: [op1, op2] };
+ commands.splice(i - 1, 1);
commands.splice(i, 1);
//changed = true;
i--;
@@ -354,9 +331,9 @@ class AdvancedFilter {
case 'NOT':
case '!':
{
- const op1 = commands[i+1];
- commands[i] = {$not: op1};
- commands.splice(i+1, 1);
+ const op1 = commands[i + 1];
+ commands[i] = { $not: op1 };
+ commands.splice(i + 1, 1);
//changed = true;
i--;
break;
@@ -412,12 +389,10 @@ Filter = {
this._fields.forEach((fieldName) => {
const filter = this[fieldName];
if (filter._isActive()) {
- if (filter.subField !== '')
- {
+ if (filter.subField !== '') {
filterSelector[`${fieldName}.${filter.subField}`] = filter._getMongoSelector();
}
- else
- {
+ else {
filterSelector[fieldName] = filter._getMongoSelector();
}
emptySelector[fieldName] = filter._getEmptySelector();
@@ -427,7 +402,7 @@ Filter = {
}
});
- const exceptionsSelector = {_id: {$in: this._exceptions}};
+ const exceptionsSelector = { _id: { $in: this._exceptions } };
this._exceptionsDep.depend();
const selectors = [exceptionsSelector];
@@ -438,7 +413,7 @@ Filter = {
if (includeEmptySelectors) selectors.push(emptySelector);
if (this.advanced._isActive()) selectors.push(this.advanced._getMongoSelector());
- return {$or: selectors};
+ return { $or: selectors };
},
mongoSelector(additionalSelector) {
@@ -446,7 +421,7 @@ Filter = {
if (_.isUndefined(additionalSelector))
return filterSelector;
else
- return {$and: [filterSelector, additionalSelector]};
+ return { $and: [filterSelector, additionalSelector] };
},
reset() {
diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json
index df284bdb..9af3544e 100644
--- a/i18n/de.i18n.json
+++ b/i18n/de.i18n.json
@@ -28,10 +28,10 @@
"activities": "Aktivitäten",
"activity": "Aktivität",
"activity-added": "hat %s zu %s hinzugefügt",
- "activity-archived": "%s in den Papierkorb verschoben",
+ "activity-archived": "hat %s in den Papierkorb verschoben",
"activity-attached": "hat %s an %s angehängt",
"activity-created": "hat %s erstellt",
- "activity-customfield-created": "Benutzerdefiniertes Feld erstellen %s",
+ "activity-customfield-created": "hat das benutzerdefinierte Feld %s erstellt",
"activity-excluded": "hat %s von %s ausgeschlossen",
"activity-imported": "hat %s in %s von %s importiert",
"activity-imported-board": "hat %s von %s importiert",
@@ -184,7 +184,7 @@
"custom-field-dropdown-options-placeholder": "Drücken Sie die Eingabetaste, um weitere Optionen hinzuzufügen",
"custom-field-dropdown-unknown": "(unbekannt)",
"custom-field-number": "Zahl",
- "custom-field-text": "Test",
+ "custom-field-text": "Text",
"custom-fields": "Benutzerdefinierte Felder",
"date": "Datum",
"decline": "Ablehnen",
@@ -378,7 +378,7 @@
"starred-boards-description": "Markierte Boards erscheinen oben in ihrer Boardliste.",
"subscribe": "Abonnieren",
"team": "Team",
- "this-board": "dieses Board",
+ "this-board": "diesem Board",
"this-card": "diese Karte",
"spent-time-hours": "Aufgewendete Zeit (Stunden)",
"overtime-hours": "Mehrarbeit (Stunden)",
diff --git a/i18n/pt-BR.i18n.json b/i18n/pt-BR.i18n.json
index 41d3e81e..989be015 100644
--- a/i18n/pt-BR.i18n.json
+++ b/i18n/pt-BR.i18n.json
@@ -3,17 +3,17 @@
"act-activity-notify": "[Wekan] Notificação de Atividade",
"act-addAttachment": "anexo __attachment__ de __card__",
"act-addChecklist": "added checklist __checklist__ no __card__",
- "act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
+ "act-addChecklistItem": "adicionado __checklistitem__ para a lista de checagem __checklist__ em __card__",
"act-addComment": "comentou em __card__: __comment__",
"act-createBoard": "criou __board__",
"act-createCard": "__card__ adicionado à __list__",
- "act-createCustomField": "created custom field __customField__",
+ "act-createCustomField": "criado campo customizado __customField__",
"act-createList": "__list__ adicionada à __board__",
"act-addBoardMember": "__member__ adicionado à __board__",
- "act-archivedBoard": "__board__ moved to Recycle Bin",
- "act-archivedCard": "__card__ moved to Recycle Bin",
- "act-archivedList": "__list__ moved to Recycle Bin",
- "act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
+ "act-archivedBoard": "__board__ movido para a lixeira",
+ "act-archivedCard": "__card__ movido para a lixeira",
+ "act-archivedList": "__list__ movido para a lixeira",
+ "act-archivedSwimlane": "__swimlane__ movido para a lixeira",
"act-importBoard": "__board__ importado",
"act-importCard": "__card__ importado",
"act-importList": "__list__ importada",
@@ -28,10 +28,10 @@
"activities": "Atividades",
"activity": "Atividade",
"activity-added": "adicionou %s a %s",
- "activity-archived": "%s moved to Recycle Bin",
+ "activity-archived": "%s movido para a lixeira",
"activity-attached": "anexou %s a %s",
"activity-created": "criou %s",
- "activity-customfield-created": "created custom field %s",
+ "activity-customfield-created": "criado campo customizado %s",
"activity-excluded": "excluiu %s de %s",
"activity-imported": "importado %s em %s de %s",
"activity-imported-board": "importado %s de %s",
@@ -47,7 +47,7 @@
"add-attachment": "Adicionar Anexos",
"add-board": "Adicionar Quadro",
"add-card": "Adicionar Cartão",
- "add-swimlane": "Add Swimlane",
+ "add-swimlane": "Adicionar Swimlane",
"add-checklist": "Adicionar Checklist",
"add-checklist-item": "Adicionar um item à lista de verificação",
"add-cover": "Adicionar Capa",
@@ -66,19 +66,19 @@
"and-n-other-card_plural": "E __count__ outros cartões",
"apply": "Aplicar",
"app-is-offline": "O Wekan está carregando, por favor espere. Recarregar a página irá causar perda de dado. Se o Wekan não carregar por favor verifique se o servidor Wekan não está parado.",
- "archive": "Move to Recycle Bin",
- "archive-all": "Move All to Recycle Bin",
- "archive-board": "Move Board to Recycle Bin",
- "archive-card": "Move Card to Recycle Bin",
- "archive-list": "Move List to Recycle Bin",
- "archive-swimlane": "Move Swimlane to Recycle Bin",
- "archive-selection": "Move selection to Recycle Bin",
- "archiveBoardPopup-title": "Move Board to Recycle Bin?",
- "archived-items": "Recycle Bin",
- "archived-boards": "Boards in Recycle Bin",
+ "archive": "Mover para a lixeira",
+ "archive-all": "Mover tudo para a lixeira",
+ "archive-board": "Mover quadro para a lixeira",
+ "archive-card": "Mover cartão para a lixeira",
+ "archive-list": "Mover lista para a lixeira",
+ "archive-swimlane": "Mover Swimlane para a lixeira",
+ "archive-selection": "Mover seleção para a lixeira",
+ "archiveBoardPopup-title": "Mover o quadro para a lixeira?",
+ "archived-items": "Lixeira",
+ "archived-boards": "Quadros na lixeira",
"restore-board": "Restaurar Quadro",
- "no-archived-boards": "No Boards in Recycle Bin.",
- "archives": "Recycle Bin",
+ "no-archived-boards": "Não há quadros na lixeira",
+ "archives": "Lixeira",
"assign-member": "Atribuir Membro",
"attached": "anexado",
"attachment": "Anexo",
@@ -104,16 +104,16 @@
"board-view-lists": "Listas",
"bucket-example": "\"Bucket List\", por exemplo",
"cancel": "Cancelar",
- "card-archived": "This card is moved to Recycle Bin.",
+ "card-archived": "Este cartão foi movido para a lixeira",
"card-comments-title": "Este cartão possui %s comentários.",
"card-delete-notice": "A exclusão será permanente. Você perderá todas as ações associadas a este cartão.",
"card-delete-pop": "Todas as ações serão removidas da lista de Atividades e vocês não poderá re-abrir o cartão. Não há como desfazer.",
- "card-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
+ "card-delete-suggest-archive": "Você pode mover um cartão para fora da lixeira e movê-lo para o quadro e preservar a atividade.",
"card-due": "Data fim",
"card-due-on": "Finaliza em",
"card-spent": "Tempo Gasto",
"card-edit-attachments": "Editar anexos",
- "card-edit-custom-fields": "Edit custom fields",
+ "card-edit-custom-fields": "Editar campos customizados",
"card-edit-labels": "Editar etiquetas",
"card-edit-members": "Editar membros",
"card-labels-title": "Alterar etiquetas do cartão.",
@@ -121,8 +121,8 @@
"card-start": "Data início",
"card-start-on": "Começa em",
"cardAttachmentsPopup-title": "Anexar a partir de",
- "cardCustomField-datePopup-title": "Change date",
- "cardCustomFieldsPopup-title": "Edit custom fields",
+ "cardCustomField-datePopup-title": "Mudar data",
+ "cardCustomFieldsPopup-title": "Editar campos customizados",
"cardDeletePopup-title": "Excluir Cartão?",
"cardDetailsActionsPopup-title": "Ações do cartão",
"cardLabelsPopup-title": "Etiquetas",
@@ -146,7 +146,7 @@
"clipboard": "Área de Transferência ou arraste e solte",
"close": "Fechar",
"close-board": "Fechar Quadro",
- "close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
+ "close-board-pop": "Você poderá restaurar o quadro clicando no botão lixeira no cabeçalho da página inicial",
"color-black": "preto",
"color-blue": "azul",
"color-green": "verde",
@@ -172,25 +172,25 @@
"createBoardPopup-title": "Criar Quadro",
"chooseBoardSourcePopup-title": "Importar quadro",
"createLabelPopup-title": "Criar Etiqueta",
- "createCustomField": "Create Field",
- "createCustomFieldPopup-title": "Create Field",
+ "createCustomField": "Criar campo",
+ "createCustomFieldPopup-title": "Criar campo",
"current": "atual",
- "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.",
- "custom-field-checkbox": "Checkbox",
+ "custom-field-delete-pop": "Não existe desfazer. Isso irá remover o campo customizado de todos os cartões e destruir seu histórico",
+ "custom-field-checkbox": "Caixa de seleção",
"custom-field-date": "Data",
- "custom-field-dropdown": "Dropdown List",
- "custom-field-dropdown-none": "(none)",
- "custom-field-dropdown-options": "List Options",
- "custom-field-dropdown-options-placeholder": "Press enter to add more options",
- "custom-field-dropdown-unknown": "(unknown)",
- "custom-field-number": "Number",
- "custom-field-text": "Text",
- "custom-fields": "Custom Fields",
+ "custom-field-dropdown": "Lista suspensa",
+ "custom-field-dropdown-none": "(nada)",
+ "custom-field-dropdown-options": "Lista de opções",
+ "custom-field-dropdown-options-placeholder": "Pressione enter para adicionar mais opções",
+ "custom-field-dropdown-unknown": "(desconhecido)",
+ "custom-field-number": "Número",
+ "custom-field-text": "Texto",
+ "custom-fields": "Campos customizados",
"date": "Data",
"decline": "Rejeitar",
"default-avatar": "Avatar padrão",
"delete": "Excluir",
- "deleteCustomFieldPopup-title": "Delete Custom Field?",
+ "deleteCustomFieldPopup-title": "Deletar campo customizado?",
"deleteLabelPopup-title": "Excluir Etiqueta?",
"description": "Descrição",
"disambiguateMultiLabelPopup-title": "Desambiguar ações de etiquetas",
@@ -205,7 +205,7 @@
"soft-wip-limit": "Limite de WIP",
"editCardStartDatePopup-title": "Altera data de início",
"editCardDueDatePopup-title": "Altera data fim",
- "editCustomFieldPopup-title": "Edit Field",
+ "editCustomFieldPopup-title": "Editar campo",
"editCardSpentTimePopup-title": "Editar tempo gasto",
"editLabelPopup-title": "Alterar Etiqueta",
"editNotificationPopup-title": "Editar Notificações",
@@ -242,12 +242,12 @@
"filter-clear": "Limpar filtro",
"filter-no-label": "Sem labels",
"filter-no-member": "Sem membros",
- "filter-no-custom-fields": "No Custom Fields",
+ "filter-no-custom-fields": "Não há campos customizados",
"filter-on": "Filtro está ativo",
"filter-on-desc": "Você está filtrando cartões neste quadro. Clique aqui para editar o filtro.",
"filter-to-selection": "Filtrar esta seleção",
- "advanced-filter-label": "Advanced Filter",
- "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. Also you can combine multiple conditions. For Example: F1 == V1 || F1 = V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 and ( F2 == V2 || F2 == V3 )",
+ "advanced-filter-label": "Filtro avançado",
+ "advanced-filter-description": "Um Filtro Avançado permite escrever uma string contendo os seguintes operadores: == != <= >= && || () Um espaço é utilizado como separador entre os operadores. Você pode filtrar todos os campos customizados digitando seus nomes e valores. Por exemplo: campo1 == valor1. Nota: se campos ou valores contém espaços, você precisa encapsular eles em aspas simples. Por exemplo: 'campo 1' == 'valor 1'. Você também pode combinar múltiplas condições. Por exemplo: F1 == V1 || F1 == V2. Normalmente todos os operadores são interpretados da esquerda para a direita. Você pode mudar a ordem ao incluir parênteses. Por exemplo: F1 == V1 e (F2 == V2 || F2 == V3)",
"fullname": "Nome Completo",
"header-logo-title": "Voltar para a lista de quadros.",
"hide-system-messages": "Esconde mensagens de sistema",
@@ -287,17 +287,17 @@
"leave-board-pop": "Tem a certeza de que pretende sair de __boardTitle__? Você será removido de todos os cartões neste quadro.",
"leaveBoardPopup-title": "Sair do Quadro ?",
"link-card": "Vincular a este cartão",
- "list-archive-cards": "Move all cards in this list to Recycle Bin",
- "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
+ "list-archive-cards": "Mover todos os cartões nesta lista para a lixeira",
+ "list-archive-cards-pop": "Isso irá remover todos os cartões nesta lista do quadro. Para visualizar cartões na lixeira e trazê-los de volta ao quadro, clique em \"Menu\" > \"Lixeira\".",
"list-move-cards": "Mover todos os cartões desta lista",
"list-select-cards": "Selecionar todos os cartões nesta lista",
"listActionPopup-title": "Listar Ações",
- "swimlaneActionPopup-title": "Swimlane Actions",
+ "swimlaneActionPopup-title": "Ações de Swimlane",
"listImportCardPopup-title": "Importe um cartão do Trello",
"listMorePopup-title": "Mais",
"link-list": "Vincular a esta lista",
"list-delete-pop": "Todas as ações serão removidas da lista de atividades e você não poderá recuperar a lista. Não há como desfazer.",
- "list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
+ "list-delete-suggest-archive": "Você pode mover a lista para a lixeira para removê-la do quadro e preservar a atividade.",
"lists": "Listas",
"swimlanes": "Swimlanes",
"log-out": "Sair",
@@ -317,9 +317,9 @@
"muted-info": "Você nunca receberá qualquer notificação desse board",
"my-boards": "Meus Quadros",
"name": "Nome",
- "no-archived-cards": "No cards in Recycle Bin.",
- "no-archived-lists": "No lists in Recycle Bin.",
- "no-archived-swimlanes": "No swimlanes in Recycle Bin.",
+ "no-archived-cards": "Não há cartões na lixeira",
+ "no-archived-lists": "Não há listas na lixeira",
+ "no-archived-swimlanes": "Não há swimlanes na lixeira",
"no-results": "Nenhum resultado.",
"normal": "Normal",
"normal-desc": "Pode ver e editar cartões. Não pode alterar configurações.",
@@ -384,12 +384,12 @@
"overtime-hours": "Tempo extras (Horas)",
"overtime": "Tempo extras",
"has-overtime-cards": "Tem cartões de horas extras",
- "has-spenttime-cards": "Has spent time cards",
+ "has-spenttime-cards": "Gastou cartões de tempo",
"time": "Tempo",
"title": "Título",
"tracking": "Tracking",
"tracking-info": "Você será notificado se houver qualquer alteração em cards em que você é o criador ou membro",
- "type": "Type",
+ "type": "Tipo",
"unassign-member": "Membro não associado",
"unsaved-description": "Você possui uma descrição não salva",
"unwatch": "Deixar de observar",
@@ -398,12 +398,12 @@
"uploaded-avatar": "Avatar carregado",
"username": "Nome de usuário",
"view-it": "Visualizar",
- "warn-list-archived": "warning: this card is in an list at Recycle Bin",
+ "warn-list-archived": "Aviso: este cartão está em uma lista na lixeira",
"watch": "Observar",
"watching": "Observando",
"watching-info": "Você será notificado em qualquer alteração desse board",
"welcome-board": "Board de Boas Vindas",
- "welcome-swimlane": "Milestone 1",
+ "welcome-swimlane": "Marco 1",
"welcome-list1": "Básico",
"welcome-list2": "Avançado",
"what-to-do": "O que você gostaria de fazer?",
@@ -454,19 +454,19 @@
"hours": "horas",
"minutes": "minutos",
"seconds": "segundos",
- "show-field-on-card": "Show this field on card",
+ "show-field-on-card": "Mostrar este campo no cartão",
"yes": "Sim",
"no": "Não",
"accounts": "Contas",
"accounts-allowEmailChange": "Permitir Mudança de Email",
- "accounts-allowUserNameChange": "Allow Username Change",
+ "accounts-allowUserNameChange": "Permitir alteração de nome de usuário",
"createdAt": "Criado em",
"verified": "Verificado",
"active": "Ativo",
- "card-received": "Received",
- "card-received-on": "Received on",
- "card-end": "End",
- "card-end-on": "Ends on",
- "editCardReceivedDatePopup-title": "Change received date",
- "editCardEndDatePopup-title": "Change end date"
+ "card-received": "Recebido",
+ "card-received-on": "Recebido em",
+ "card-end": "Fim",
+ "card-end-on": "Termina em",
+ "editCardReceivedDatePopup-title": "Modificar data de recebimento",
+ "editCardEndDatePopup-title": "Mudar data de fim"
} \ No newline at end of file
diff --git a/models/cards.js b/models/cards.js
index c77cd682..6a33fa1a 100644
--- a/models/cards.js
+++ b/models/cards.js
@@ -220,6 +220,7 @@ Cards.helpers({
}).fetch();
// match right definition to each field
+ if (!this.customFields) return [];
return this.customFields.map((customField) => {
return {
_id: customField._id,
diff --git a/package.json b/package.json
index 26283257..06b831da 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "wekan",
- "version": "1.00.0",
+ "version": "1.01.0",
"description": "The open-source Trello-like kanban",
"private": true,
"scripts": {
diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp
index edbb3d2a..eeba4409 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 = 85,
+ appVersion = 86,
# Increment this for every release.
- appMarketingVersion = (defaultText = "1.00.0~2018-05-21"),
+ appMarketingVersion = (defaultText = "1.01.0~2018-05-23"),
# Human-readable presentation of the app version.
minUpgradableAppVersion = 0,